在提出我的问题之前,我想引用“专家 C 编程”[第 276 页,最后一段]:
“Illiffe 向量数据结构的美妙之处在于,它允许将指向字符串的任意指针数组传递给函数,但只能传递指针数组和指向字符串的指针。这是因为字符串和指针都具有显式输出的约定可以用作结束标记的边界值(分别为 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]);
输出为:(nil) 0x4003db 0x7fffe48e4776 0x4006c5
因此,通过上述输出,很明显有一个明确的越界(nil)值分配给其中一个指针(一个指针是 NIL),但它真的是结束标记吗?不。
它是 C 语言的那些“实现定义”的东西之一吗?
我在 Ubuntu 机器上使用 GCC 编译器(4.6.3)。