我对 C 中数组的 typedef 的理解有问题。 代码没有按预期工作。我在调试这个简单的代码时提供了一些屏幕截图。您可以看到,只有 array[0] 的第一个元素被分配给 0xff。 [1] 和 [2] 元素未分配。
探索change_array函数的汇编代码,我注意到array + 0x28和array + 0x50的地址用于分配[1]和[2]元素。看起来像使用了 TMyArray[10][n] 。
所以,我不知道如何访问函数change_array中的数组元素。
typedef int TMyArray[10];
TMyArray test_array = {0};
void change_array(TMyArray * array)
{
*array[0] = 0xff;
*array[1] = 0xff; // wrong!
*array[2] = 0xff; // wring!
}
int main()
{
change_array(&test_array);
return 0;
}
我希望对此行为有任何解释。
一元
*
的优先级低于后缀 []
运算符,因此表达式
*array[1]
被解析为
*(array[1])
意味着您正在尝试取消引用单个数组元素,这不是您想要的。相反,您需要取消引用
array
first,然后索引到结果中:
(*array)[0] = 0xff;
(*array)[1] = 0xff;
(*array)[2] = 0xff;
请注意,我们通常不会传递指向数组的指针,而是传递指向数组第一个元素的指针。
typedef int TMyArray[10];
void change_array( TMyArray p ) { // Would be clearer as identical `int *p`.
p[0] = 0xff;
p[1] = 0xff;
p[2] = 0xff;
}
int main( void ) {
TMyArray test_array = { 0 };
change_array( test_array );
}