【发布时间】:2020-04-26 23:46:23
【问题描述】:
几年后我又开始涉足 C 语言了。我认为基于我发现的other answers,以下两个打印语句会评估为相同的输出;但似乎并非如此。
int main()
{
int** arr = malloc(
3 * sizeof(int*)
);
for(int y = 0; y < 3; y++) {
int* subarr = malloc(
3 * sizeof(int)
);
for(int x = 0; x < 3; x++) {
subarr[x] = y * 3 + x + 1;
}
arr[y] = subarr;
}
printf("%d\n", *(&arr[0][0]) + 3);
printf("%d\n", (&arr[0][0])[3]);
}
谁能解释这里发生了什么/我错过了什么?
【问题讨论】:
-
x[3]和*(x+3)是一样的,但是你的第一次打印是(*x) + 3这是不同的 -
还有
(&arr[0][0])[3]访问越界(导致未定义行为) -
啊,好吧,这就解释了为什么它们评估为不同的值。是的,我不确定尝试通过越界数组访问运算符访问下一个子数组是否合法,所以我想这回答了我的两个问题,谢谢。
标签: c arrays pointers malloc pointer-arithmetic