为什么会这样:指向C字符串的指针数组?

时间:2014-01-31 19:09:11

标签: c string pointers

在打印完所有字符串后,为什么这样的检查*(string + i)不会通过? printf("%p", string + i + 1);的输出肯定显示string + i + 1不是NULL 我已经用几个数量的字符串多次尝试了这段代码 也许一些C大师可以给出答案吗?提前致谢。 :-)

代码:

#include <stdio.h>

int
main(void)
{
        size_t i;
        char *string[] = {
                "Hey, baby!",
                "How are ya?",
                "What the heck is going on in here?"
        };

        for (i = 0; *(string + i); ++i)
        {
                printf("%s\t%p\n", *(string + i), string + i);
        }

        printf("%p", string + i + 1);

        return 0;
}

输出:

[aenry@MintK50ID 2]$ ./test   
Hey, baby!  0x7fff691978e0
How are ya? 0x7fff691978e8
What the heck is going on in here?  0x7fff691978f0
0x7fff69197900%

[aenry@MintK50ID 2]$ gcc -v   
...
gcc version 4.8.1 (Ubuntu/Linaro 4.8.1-10ubuntu9)

--------编辑: 事实证明,这实际上是垃圾代码,并且某种方式只有gcc 以其工作的方式编译它。 UB努夫说。谢谢,伙计们。

3 个答案:

答案 0 :(得分:3)

您不能指望这样做:for (i = 0; *(string + i); ++i)

每个字符串以0字符结尾的事实并不意味着字符串数组以NULL指针结尾。

*(string + i)变为大于2时,i是非法内存访问。

将上述内容更改为:for (i=0; i<sizeof(string)/sizeof(*string); ++i)

答案 1 :(得分:1)

你是世界上未定义的行为 - 所以任何事情都可能发生。

只需在数组末尾添加NULL

答案 2 :(得分:0)

字符串文字隐式地以空值终止:"Hello"在幕后变为{ 'H', 'e', 'l', 'l', 'o', '\0' }(并且它变成具有6个插槽的数组)。

但是上面的字符串(char数组)仅适用 ,而如果使用字符串文字或已经使用的函数创建注意添加空终止符。其他类型的数组(包括字符串数组,就像你在这里一样),不一定是空终止的。当然,只要数组有一个额外的槽来存储空值,就可以通过在末尾手动添加null来使它们终止为空。