gpt4 book ai didi

c - 数组内存存储

转载 作者:行者123 更新时间:2023-11-30 15:23:45 25 4
gpt4 key购买 nike

我对 C 语言比较陌生,刚刚学习程序期间存储内存的方式。有人可以解释一下为什么下面的代码:

int main(int argc, char** argv){
float x[3][4];
printf("%p\n%p\n%p\n%p\n", &(x[0][0]), &(x[2][0]), &(x[2][4]), &(x[3][0]));
return 0;
}

输出:

0x7fff5386fc40
0x7fff5386fc60
0x7fff5386fc70
0x7fff5386fc70

为什么前 3 个在内存中的位置不同,但最后一个与第三个相同?为什么前两个之间有 20 的差距,而第二和第三之间却有 10 的差距? &(x[2][0]) 和 &(x[2][4]) 之间的距离似乎不是 &(x[0][0]) 和 &(x[2] 之间距离的一半[0])。提前致谢。

最佳答案

当您声明大小为 n 的数组时,索引范围为 0 到 n - 1。因此 x[2][4]x[3][0] 实际上超出了数组的范围。

如果您还不知道,您声明的多维数组实际上是一个数组的数组

您的编译器将每个数组一个接一个地布置在内存中。因此,在内存中,元素按以下顺序排列:x[0][0]x[0][1]x[0 ][2]x[0][3]x[1][0]x[1][1] 等等。

看来您已经了解了指针的工作原理,所以我将对此进行掩饰。最后两个元素相同的原因是因为 x[2][4] 超出范围,因此它指的是 x[2 结束后内存中的下一个插槽] 数组。这将是 x[3] 数组的第一个元素(如果有的话),该元素将为 x[3][0]

现在,由于 x[3][0] 引用了一个没有变量映射的地址,因此取消引用它完全有可能导致段错误。在您的程序的上下文中,恰好有一些东西存储在 0x7fff5386fc70 中;换句话说,你很幸运。

关于c - 数组内存存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28661579/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com