【发布时间】:2016-03-12 13:05:19
【问题描述】:
我对以下代码有疑问:
#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 之前。但我仍然得到相同的结果...
也许有人知道这背后的魔力。提前感谢您抽出宝贵时间回答我的问题。
【问题讨论】:
-
您的代码格式错误,无法编译。你是说第7行的
)是=吗? -
抱歉,我猜这是因为我的虚拟机出现了复制和粘贴问题。我现在就改。
-
第6行和第7行没用,但也有问题。主要问题是两个未初始化的指针。
-
未定义行为意味着 C 编程语言标准没有指定程序在给定一段源代码时应该如何表现。您将获得的结果将取决于语言的实现(编译器,链接器,...),但在这种情况下,指针和数组彼此相邻存储在堆栈上,因此您可以访问数组通过指针操作。
标签: c arrays pointers initialization