您得到一个并且总是一个 NULL 值的事实是由于堆栈的内容,这取决于调用 main 之前执行的代码,而这又取决于您正在使用的编译器/libc,以及编译选项。
但是一旦编译,运行程序任意次数总是会得到相同的值。
正如其他答案中所述,这是因为您没有明确初始化数组,并且它的范围(函数本地)允许编译器将它放在堆栈上,在那里它获取调用 main 之前的内容。
要获得 6 个 NULL 指针,您应该明确地初始化数组 (int *array[6] = {0};) 或者使其成为静态或全局的。
在后面的情况下,编译器会将数组放在 bss 部分(二进制文件中不存在的数据部分,但在调用 main() 函数之前由 libc 分配并初始化为零)。
在第一种情况下(本地数组初始化为 0),编译器现在可以进行优化,因为该值是已知的并且永远不会被修改,并且肯定会删除数组和测试并简单地调用 printf 6 次。
使用另一个编译器编译,或者使用不同的优化级别(-O2、-O3)会给你一个不同的结果,但在每次调用之间仍然是一致的(如果不相同的话)。
无论如何,无论初始化您的数组,您都应该根据 C 标准来修正您的代码:
你的 main 必须返回一个值,并且“for”循环初始声明只允许在 C99 模式下,所以你应该得到这个:
#include <stdio.h>
int main(){
int* array[6];
int i = 0;
for (i = 0; i < 6; i++) {
if (array[i] == NULL) {
printf("%d NULL\n", i);
}
}
return 0;
}
我添加了显示NULL值的位置编号,以表明它始终是同一个。
您甚至可以添加 else 语句,并在不为 NULL 时打印值:
} else {
printf("%d %p\n", i, array[i]);
你会得到这样的东西:
$ ./test
0 NULL
1 0x4011cd
2 0x7f8d2fdf64c0
3 NULL
4 0x4011a0
5 0x401050
$ ./test
0 NULL
1 0x4011cd
2 0x7fa96155e4c0
3 NULL
4 0x4011a0
5 0x401050
我可以运行它 1000 次,0、1、3、4 和 5 的值总是相同的。只有数字2的值发生了变化,我认为这意味着它是用来存储地址的。
通过读取 objdump -D 的输出并分析 GCC 生成的代码,可以得到准确的信息。