在提出我的问题之前,我想引用“专家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]);
输出为:(0) 0x4003db 0x7fffe48e4776 0x4006c5
因此,对于上面的输出,很明显,有一个明确的无界(nil)值分配给其中一个指针(一个指针是零),但它真的是结束标记吗?不是的。
这是C语言中“实现定义”的东西之一吗?
我在Ubuntu机器上使用GCC编译器(4.6.3)。
发布于 2013-09-12 12:13:52
你误解了“专家C编程”中的引语。其中的关键词组如下:
This is because both strings and pointers have the *convention* of an explicit
out-of-bound value (NUL and NULL, respectively).
有一个字符串数组,使最后一个指针被设置为NULL
是可能的,甚至是传统的。这样就可以很容易地迭代数组,而无需确切知道数组中有多少元素:
char* dwarves[] = { "Dopey",
"Grumpy",
"Sleepy",
"Happy",
"Sneezy",
"Bashful",
"Doc",
NULL
};
但是您必须显式地设置指向NULL
的最后一个指针。这样的结构很有用,因为它们允许优雅的代码。因此,如果要打印或以其他方式操作数组,则不需要担心数组中有多少字符串,因为NULL
指针将指示结束:
for (char** pWalk = dwarves; *pWalk; pWalk++)
printf ("%s\n", *pWalk);
这种特殊类型的粗糙数组结构的美妙之处在于,根据定义,字符串具有内置的NUL
终止符,指针数组以NULL
结束,因此两个维度的端点都是已知的。但是,作为数组中最后一个指针的NULL
并不是内置于该语言中的。它必须被显式设置。如果不这样做,就相当于声明一个char
数组,而不是用一个NUL
终止它。
char myString[] = { 'H', 'e', 'l', 'l', 'o' } // No NUL termination
正如您必须知道这个数组中有多少个字符,如果您想以任何有用的方式操作它,如果没有指针数组末尾的NULL
,那么操作它就会更加困难。
这就是彼得范德林登在你引用的关于Illiffe数据结构的段落中所说的全部内容。
发布于 2013-09-12 11:34:02
这是C语言中“实现定义”的东西之一吗?
不,那不是实现-定义-这是简单的“未定义”。对于所有类型的数组也是如此:在它们中看到的值在显式初始化之前是未定义的。
我从上面的文本中了解到的是,如果有一个指针数组,它们就有显式的超出约束的值,比如
NULL
。
作者想说,有一个值(特别是NULL
值)可以用来标记指针数组中的“无值”。作者并不意味着默认情况下这样一个无值标记将被放置到一个指针数组中。
发布于 2013-09-12 11:39:47
具有自动存储持续时间的数组或任何对象(即在函数体中定义的没有static
关键字的任何对象)都没有默认值,除非您指定了默认值。它的初始值是垃圾,在给它赋值之前,您不能访问该值。
具有静态存储持续时间的对象(即在任何函数之外定义的任何对象和/或使用static
关键字定义的对象)被初始化为零,其含义为“零”(整数为0,浮点为0.0,指针为null )递归地应用于子对象。
可以使用初始化程序来确保指针对象设置为空指针,或设置为任意值:
int *x[2] = { NULL, NULL };
或者,更简单地说:
int *x[2] = { 0 }; /* sets first element to 0, which is converted to a null
pointer; other elements are implicitly set to null
pointers as well */
https://stackoverflow.com/questions/18772872
复制