首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >“指针数组”中指针的初始值是多少?

“指针数组”中指针的初始值是多少?
EN

Stack Overflow用户
提问于 2013-09-12 19:31:26
回答 4查看 2.3K关注 0票数 2

在提出我的问题之前,我想引用“专家C编程”一页:276,最后一段

“Illiffe向量数据结构的优点是,它允许将指向字符串的任意指针数组传递给函数,但只允许将指针的数组传递给,只允许传递指向字符串的指针。这是因为字符串和指针都具有显式超出绑定值(NUL和NULL )的约定,可以用作结束标记。”

因此,我从上面的文本中了解到,如果有一个指针数组,它们有显式的超出约束的值,比如NULL。(如果我错了,请纠正我.)

因此,这让我想知道指针数组的默认值是什么(认为指针数组的最后指针为NULL)。尝试在下面的代码片段和结果是非常不同的。

代码语言:javascript
代码运行次数:0
运行
复制
    int *x[2];
    printf("%p %p",x[0],x[1]);

产出为:(零) 0x400410

代码语言:javascript
代码运行次数:0
运行
复制
    int *x[3];
    printf("%p %p %p",x[0],x[1],x[2]);

输出为: 0xf0b2ff 0x400680 (零)

代码语言:javascript
代码运行次数:0
运行
复制
    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)。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-09-12 20:13:52

你误解了“专家C编程”中的引语。其中的关键词组如下:

代码语言:javascript
代码运行次数:0
运行
复制
This is because both strings and pointers have the *convention* of an explicit 
out-of-bound value (NUL and NULL, respectively).

有一个字符串数组,使最后一个指针被设置为NULL是可能的,甚至是传统的。这样就可以很容易地迭代数组,而无需确切知道数组中有多少元素:

代码语言:javascript
代码运行次数:0
运行
复制
char* dwarves[] = { "Dopey",
                "Grumpy",
                "Sleepy",
                "Happy",
                "Sneezy",
                "Bashful",
                "Doc",
                NULL 
                };

但是您必须显式地设置指向NULL的最后一个指针。这样的结构很有用,因为它们允许优雅的代码。因此,如果要打印或以其他方式操作数组,则不需要担心数组中有多少字符串,因为NULL指针将指示结束:

代码语言:javascript
代码运行次数:0
运行
复制
for (char** pWalk = dwarves; *pWalk; pWalk++)
    printf ("%s\n", *pWalk);

这种特殊类型的粗糙数组结构的美妙之处在于,根据定义,字符串具有内置的NUL终止符,指针数组以NULL结束,因此两个维度的端点都是已知的。但是,作为数组中最后一个指针的NULL并不是内置于该语言中的。它必须被显式设置。如果不这样做,就相当于声明一个char数组,而不是用一个NUL终止它。

代码语言:javascript
代码运行次数:0
运行
复制
char myString[] = { 'H', 'e', 'l', 'l', 'o' }    // No NUL termination

正如您必须知道这个数组中有多少个字符,如果您想以任何有用的方式操作它,如果没有指针数组末尾的NULL,那么操作它就会更加困难。

这就是彼得范德林登在你引用的关于Illiffe数据结构的段落中所说的全部内容。

票数 2
EN

Stack Overflow用户

发布于 2013-09-12 19:34:02

这是C语言中“实现定义”的东西之一吗?

不,那不是实现-定义-这是简单的“未定义”。对于所有类型的数组也是如此:在它们中看到的值在显式初始化之前是未定义的。

我从上面的文本中了解到的是,如果有一个指针数组,它们就有显式的超出约束的值,比如NULL

作者想说,有一个值(特别是NULL值)可以用来标记指针数组中的“无值”。作者并不意味着默认情况下这样一个无值标记将被放置到一个指针数组中。

票数 4
EN

Stack Overflow用户

发布于 2013-09-12 19:39:47

具有自动存储持续时间的数组或任何对象(即在函数体中定义的没有static关键字的任何对象)都没有默认值,除非您指定了默认值。它的初始值是垃圾,在给它赋值之前,您不能访问该值。

具有静态存储持续时间的对象(即在任何函数之外定义的任何对象和/或使用static关键字定义的对象)被初始化为零,其含义为“零”(整数为0,浮点为0.0,指针为null )递归地应用于子对象。

可以使用初始化程序来确保指针对象设置为空指针,或设置为任意值:

代码语言:javascript
代码运行次数:0
运行
复制
int *x[2] = { NULL, NULL };

或者,更简单地说:

代码语言:javascript
代码运行次数:0
运行
复制
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 */
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18772872

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档