C - 未初始化的指针 - >指向一个数组

时间:2015-12-07 19:45:41

标签: c arrays pointers initialization

我对以下代码有疑问:

#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之前。但我仍然得到相同的结果......

也许有人知道这背后的魔力。提前感谢您抽出宝贵时间回答我的问题。

2 个答案:

答案 0 :(得分:3)

首先,您可能知道,此行为在标准中称为未定义行为。

从标准的角度来看,这个程序可能会删除你的整个硬盘,发射核导弹,或者给你的老板发一个非常糟糕的邮件。 但是,通常最终导致程序失败。

现在回到你的案例 - 我认为这是因为一个或多个选项:

  1. 您的编译器按类型对变量的内存进行分组。
  2. 您的编译器按对齐大小对变量的内存进行分组。
  3. 现在它仍然不是很好的理由,但也许这种分组是因为当变量未初始化时编译器代码中不必要的行。编译器的这个变量也可能是未初始化的: - )

答案 1 :(得分:0)

当局部变量未初始化时,这些变量的内容为undefined

这意味着无法预测这些变量的内容。试图读取它们可能会输出一些意外的东西,或者可能看起来有效。在指针变量的情况下,解除引用通常会导致核心转储,但不一定。

这就是为什么在尝试读取(或取消引用)变量之前始终初始化变量很重要。

使用未初始化的变量如何回来咬你的一个例子是OpenSSL。他们故意将某些变量定义为随机性的来源。但是不熟悉这些代码的人后来在其上运行了Valgrind,它报告了“问题”。然后修复了“bug”,导致随机数生成器中断。您可以找到更多详细信息here