在提出我的问题之前,我想引用“Expert C Programming”[Page :276, last paragraph]:
“Illiffe vector 数据结构的美妙之处在于它允许将任意指向字符串的指针数组传递给函数,但只能是指针数组,并且只能是指向字符串的指针。 这是因为字符串和指针 都有明确的越界值约定(分别为 NUL 和 NULL),可以用作结束标记。”
所以,我从上面的文字中了解到,如果有一个指针数组,它们就会有明确的越界值,比如 NULL。(请纠正我,如果我错了...)
所以,这让我想知道指针数组的默认值是什么(认为指针数组的最后一个指针为 NULL)。尝试了以下代码片段,结果大不相同。
int *x[2];
printf("%p %p",x[0],x[1]);
输出是:(无)0x400410
int *x[3];
printf("%p %p %p",x[0],x[1],x[2]);
输出是:0xf0b2ff 0x400680(无)
int *x[4];
printf("%p %p %p %p", x[0],x[1],x[2],x[3]);
输出是:(无)0x4003db 0x7fffe48e4776 0x4006c5
因此,通过上面的输出,很明显有一个明确的越界(nil)值分配给其中一个指针(一个指针为 NIL),但它真的是结束标记吗?没有。
它是 C 语言的那些“实现定义”的东西之一吗?
我在 Ubuntu 机器上使用 GCC 编译器 (4.6.3)。
最佳答案
Is it one of those "Implementation defined" things of C-language?
不,这不是实现定义的——它是简单的“未定义”。所有类型的数组也是如此:您在其中看到的值在显式初始化之前是未定义的。
What I understood from above text is that if there is an array of pointers they have explicit out-of-bound value like
NULL
.
作者想说的是,有一个值(具体来说,NULL
值)可以用来标记指针数组中的“无值”。作者并没有暗示这样一个无值标记会被默认放入一个指针数组中。
关于c - "array of pointers"中指针的初始值是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18772872/