【发布时间】:2019-11-04 06:01:30
【问题描述】:
我在 for 循环中声明了一个数组并尝试打印它的基地址。
#include<stdio.h>
int main(){
int n=16;
for(int i=1;i<=n;i++){
int a[i];
int b[16];
int c[n];
printf("%p %p %p\n",(void *)a,(void *)b,(void *)c);
}
return 0;
}
输出如下:
0x7fffe6191740 0x7fffe6191770 0x7fffe6191700
0x7fffe6191740 0x7fffe6191770 0x7fffe6191700
0x7fffe6191740 0x7fffe6191770 0x7fffe6191700
0x7fffe6191740 0x7fffe6191770 0x7fffe6191700
0x7fffe6191730 0x7fffe6191770 0x7fffe61916f0
0x7fffe6191730 0x7fffe6191770 0x7fffe61916f0
0x7fffe6191730 0x7fffe6191770 0x7fffe61916f0
0x7fffe6191730 0x7fffe6191770 0x7fffe61916f0
0x7fffe6191720 0x7fffe6191770 0x7fffe61916e0
0x7fffe6191720 0x7fffe6191770 0x7fffe61916e0
0x7fffe6191720 0x7fffe6191770 0x7fffe61916e0
0x7fffe6191720 0x7fffe6191770 0x7fffe61916e0
0x7fffe6191710 0x7fffe6191770 0x7fffe61916d0
0x7fffe6191710 0x7fffe6191770 0x7fffe61916d0
0x7fffe6191710 0x7fffe6191770 0x7fffe61916d0
0x7fffe6191710 0x7fffe6191770 0x7fffe61916d0
为什么数组的基地址每次都变?是否为每次迭代分配内存。如果是这样,为什么地址在 4 次迭代中没有改变?
请解释a、b和c在声明、内存分配和基地址方面的区别。
【问题讨论】:
-
这高度依赖于您的操作系统。裸机微控制器和 Linux PC 会给出不同的结果。还要修复你的 printf。
-
你不应该关心这个
-
@Clonk 我在 Windows、Linux 和在线平台上尝试过,都给出了相同的行为。
-
@melpomene %p 给出十六进制, %u 给出等效的整数值,只是没有变化。反正改成 %p。
-
仍然不完全便携。为了 100% 正确,您必须将每个参数转换为
(void *)。
标签: c arrays loops memory-management