为何C语言中二维数组的指针算术与[]下标访问结果不一致?
问题解析:二维数组访问中的指针表达式差异
为什么*(frame + i)[j]会访问错误内存?
核心原因是C语言的运算符优先级:数组下标运算符[]的优先级高于间接寻址运算符*。
你原本以为*(frame + i)[j]等价于*(*(frame + i) + j),但实际运算顺序完全不同:
- 正确的
frame[i][j]和*(*(frame + i) + j):先计算frame + i(得到指向第i行的指针),解引用后拿到第i行的数组指针,再加j,最后解引用得到目标元素。 - 错误的
*(frame + i)[j]:因为[]优先级更高,会先计算(frame + i)[j],根据下标等价规则,这等于*( (frame + i) + j ),也就是*(frame + i + j)。然后再对这个结果做外层的*,就变成*( *(frame + i + j) )——这相当于把frame + i + j这个地址当成一个指针类型去解引用,完全偏离了你要访问的二维数组元素位置,自然会触发错误内存访问。
如果要让表达式等价于正确写法,必须加括号改变优先级:(*(frame + i))[j],这样就和frame[i][j]完全一致了。
免费的C语言标准文档
你提到的C99规范草稿n1256是免费可获取的,除此之外:
- C11标准的免费草稿是
n1570 - C17标准的免费草稿是
n2310
这些都是官方发布的最终版标准的草稿版本,内容和正式标准几乎一致,可以直接搜索对应的文档编号找到下载资源。
内容的提问来源于stack exchange,提问作者Michele
相关产品推荐
相关产品推荐

