C编译器处理多维数组间接寻址时代码生成异常问题咨询
你确实遗漏了C标准中关于数组类型转换与间接寻址运算符行为的相关规则,这是代码生成错误的核心原因:
- C标准规定,除作为
&、sizeof、_Alignof运算符的操作数外,所有数组类型的左值都会被隐式转换为指向数组首元素的指针。该转换仅为类型层面的语义处理,不会产生实际内存访问,转换后的指针值与数组的起始地址完全一致。 - 以
int x[M][N]为例,x本身是int[M][N]类型的数组,隐式转换后得到int (*)[N]类型的指针,x + y的步长为sizeof(int[N]),运算结果仍是指向数组x[y]的int (*)[N]类型指针。 - 对上述指针执行
*操作的结果是int[N]类型的数组左值,而非直接读取内存中的存储值。由于该数组左值后续要参与+ z运算,会自动隐式转换为int*类型的指针,整个过程不需要执行deref操作,指针值仍然是x + y计算得到的地址。 - 后续
+ z运算的步长为sizeof(int),最终得到指向x[y][z]的int*指针,此时才需要执行一次deref读取目标地址的存储值。
你生成的汇编中第一个deref是多余的错误操作,相当于把x[y]的第一个元素值当成了后续指针运算的基地址,自然无法得到正确结果。
内容的提问来源于stack exchange,提问作者Popeye Otaku
相关产品推荐
相关产品推荐

