C语言typedef数组访问异常:仅首元素赋值成功,求解析
问题原因与解决方案
核心问题:运算符优先级与数组指针的理解偏差
你定义的typedef int TMyArray[10],是把TMyArray声明为包含10个int的数组类型,所以TMyArray *array是一个指向10元素int数组的指针,而非指向单个int的指针。
代码里的*array[1]写法犯了运算符优先级错误:[]的优先级高于*,所以array[1]会先被解析为“取指针array的第1个元素”——也就是从array指向的地址往后偏移一个TMyArray的大小(10个int,40字节=0x28)的位置,再对这个位置解引用赋值。这就解释了汇编里出现array+0x28、array+0x50的原因:array[1]对应偏移40字节,array[2]对应偏移80字节,这些位置根本不是你要修改的test_array的元素。
而*array[0]能正常工作只是巧合:array[0]就是指针array本身指向的地址,解引用后刚好是test_array[0]。
正确的访问方式
要正确访问原数组的元素,需要先解引用array得到原数组,再用下标访问,也就是给解引用加括号提升优先级:
typedef int TMyArray[10]; TMyArray test_array = {0}; void change_array(TMyArray * array) { (*array)[0] = 0xff; (*array)[1] = 0xff; // 正确 (*array)[2] = 0xff; // 正确 } int main() { change_array(&test_array); return 0; }
或者用指针算术的写法,效果完全一致:
void change_array(TMyArray * array) { *(*array + 0) = 0xff; *(*array + 1) = 0xff; *(*array + 2) = 0xff; }
补充说明
如果觉得数组指针的写法容易混淆,也可以换一种typedef方式,把数组封装成结构体,这样指针的行为会更直观:
typedef struct { int data[10]; } TMyArray; TMyArray test_array = {0}; void change_array(TMyArray * array) { array->data[0] = 0xff; array->data[1] = 0xff; array->data[2] = 0xff; }
内容的提问来源于stack exchange,提问作者UL7AAjr
相关产品推荐
相关产品推荐

