我对以下代码有疑问:
#include <stdio.h>
int main() {
int i;
char char_array[5] = "abcde";
int int_array[5] = {1, 2, 3, 4, 5};
char *char_pointer;
int *int_pointer;
for(i=0; i < 5; i++) {
printf("[integer pointer] points to %p, which contains the integer %d\n", int_pointer, *int_pointer);
int_pointer = int_pointer + 1;
}
for(i=0; i < 5; i++) {
printf("[char pointer] points to %p, which contains the char '%c'\n", char_pointer, *char_pointer);
char_pointer = char_pointer + 1;
}
}
我没有初始化任何指针,只是设置指针的类型。这两个指针指向数组的正确内存地址,并从位置[0]开始。
将Ubuntu 7.04与gcc编译器配合使用。
如果我运行代码,我会得到以下结果:
[integer pointer] points to 0xbffff7f0, which contains the integer 1
[integer pointer] points to 0xbffff7f4, which contains the integer 2
[integer pointer] points to 0xbffff7f8, which contains the integer 3
[integer pointer] points to 0xbffff7fc, which contains the integer 4
[integer pointer] points to 0xbffff800, which contains the integer 5
[char pointer] points to 0xbffff810, which contains the char 'a'
[char pointer] points to 0xbffff811, which contains the char 'b'
[char pointer] points to 0xbffff812, which contains the char 'c'
[char pointer] points to 0xbffff813, which contains the char 'd'
[char pointer] points to 0xbffff814, which contains the char 'e'
我知道这不是正确的编程风格,你不应该让指针未初始化,但是我遇到了这个并想问你,为什么指针知道他必须指向哪个地址而不进行初始化。
我还在代码int_array2和char_array2中添加了两个数组,首先是在int_array / char_array之后,第二个是在int_array / char_array之前。但我仍然得到相同的结果......
也许有人知道这背后的魔力。提前感谢您抽出宝贵时间回答我的问题。
答案 0 :(得分:3)
首先,您可能知道,此行为在标准中称为未定义行为。
从标准的角度来看,这个程序可能会删除你的整个硬盘,发射核导弹,或者给你的老板发一个非常糟糕的邮件。 但是,通常最终导致程序失败。
现在回到你的案例 - 我认为这是因为一个或多个选项:
现在它仍然不是很好的理由,但也许这种分组是因为当变量未初始化时编译器代码中不必要的行。编译器的这个变量也可能是未初始化的: - )
答案 1 :(得分:0)