用不同的编译器理解C中的指针和作用域



我最近遇到了一个问题,即gcc编译器如何处理一些遗留代码中的指针。以下是一个关于如何设置代码的精简示例:

int someCondition; // Set elsewhere.
static void aModifyingFunc(uint32_t* pArray);
void someFunc(void)
{
uint32_t* pArray = NULL;
if(someCondition == 1)
{
pArray = (uint32_t[]){1u, 2u, 3u};
}
else
{
pArray = (uint32_t[]){4u, 5u, 6u};
}
aModifyingFunc(pArray);
}
static void aModifyingFunc(uint32_t* pArray)
{
// do something here with pArray
}

一个编译器将pArray的值正确地传递给aModifyingFunc,aModifyngFunc会按预期执行所有操作。另一个更新的版本似乎践踏了pArray所指向的所有内存。aModifyingFunc是静态的,因此应该在此处内联。

这是新/旧编译器的编译器错误吗?或者这是代码编写方式的问题?

表达式(uint32_t[]){1u, 2u, 3u}在C.中被称为复合文字

您在块内创建了一个复合文字,然后试图在块外使用它,这是不允许的,因为它的作用域仅为块。

请参阅复合文字寿命和是否阻止

最新更新