You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 11:11:10