2013-06-23 84 views
3

数组循环当我尝试通过下面的C程序循环,我得到的错误:“段错误: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'不起作用,什么我应该做的,而不是。

+0

'for(i = 0; i <3; i ++){...}'::没有前哨。 – wildplasser

+1

我认为其他人都拥有它,但我只是在数组未定义之后添加内存。这实际上是可能的(如果你真的拥有内存之后的内存,那么你的代码将工作的时间是1/256倍)。它完全没有定义。 C中的数组没有内置大小。你必须跟你的数组并行追踪大小,这就是你的<3检查工作的原因。或者,sizeof,你必须跟踪类型。当你将数组传递给一个函数时,它会变成一个指针,然而你失去了sizeof。 – xaxxon

回答

8

您需要缺少一个终止字符串。您的a的定义应该是

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

没有空字符串,您正在访问a[3]不存在,因此,在赛格故障。

+1

你已经回答了他的问题,但我有一个问题:使用'sizeof'是一种确定终止而不需要额外字符串的方法吗? (关于第二个想法可能是难看的指针算术) – nonsensickle

+0

谢谢。这很好。 – Ben

+1

@nonsensical:您可以使用'sizeof'运算符,但您必须使用'sizeof(a)/ sizeof(char *)'。在任何情况下,OP都会问段错误的原因,并且从他的问题中可以明显看出他正试图终止循环上的NULL字符。 – unxnut