C - 循环遍历指针数组

3
当我尝试循环执行以下C程序时,出现错误:"Segmentation fault: 11"。
#include <stdio.h>

main() {

int i;

char *a[] = {
    "hello",
    "how are you",
    "what is your name"
};

for (i = 0; a[i][0] != '\0'; i++ ) {
    printf("\n%s", a[i]);
}
}

但是当我用以下内容替换 for 循环中的测试时,就不会出错,一切都正常运行。

    for (i = 0; i < 3; i++ ) {
    printf("\n%s", a[i]);
}

如果有人能够解释为什么测试a [i] [0]!= '\ 0'不起作用,以及我应该做什么,请让我非常感激。


for ( i = 0; i < 3; i++ ) { ... } :: 没有哨兵。 - wildplasser
1
我认为其他人都有这个问题,但我要强调的是数组后面的内存未被定义。如果实际上数组之后的内存已经分配了(1/256的概率),你的代码可能会运行,但是它是完全未定义的。在C语言中,数组没有内置的大小。你必须与数组并行跟踪其大小,这就是为什么您的<3检查有效的原因。或者,使用sizeof时,您必须跟踪数据类型。当把数组传递给函数时,它将被转换为指针,并且您将失去sizeof。 - xaxxon
1个回答

8
你需要有一个缺失的终止字符串。你定义 a 的方式应该是:
char *a[] = {
        "hello",
        "how are you",
        "what is your name",
        ""
    };

没有空字符串,你正访问一个不存在的a[3],因此发生了段错误。

1
你已经回答了他的问题,但我有一个旁注:使用 sizeof 是否可以作为一种确定终止的方法,而不需要额外的字符串?(想了想,这可能会导致丑陋的指针算术运算) - nonsensickle
1
@nonsensical:你可以使用 sizeof 运算符,但是你必须使用 sizeof ( a ) / sizeof ( char * )。无论如何,OP问了segfault的原因,从他的问题中可以看出他试图在缺失空字符的情况下终止循环。 - unxnut
@unxnut 我同意,我跑题了。当时我正在编写类似的东西,所以我的思维偏离了主题。 - nonsensickle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接