为什么这会在编译后停止运行。它正确地给出输出,但在它之后它会腐败。
#include <stdio.h>
int main() {
char *cities[] = {"Adiyaman","Kayseri","Istanbul"};
int i;
for(i=0; *(cities+i) != NULL; i++) {
printf("%s\n",*(cities+i));
}
return 0;
}
答案 0 :(得分:1)
无法保证cities
数组的最后一个元素为NULL。它肯定不是-NULL 和,它肯定是非预期的内存访问。
所以,说
for(i=0; *(cities+i) != NULL; i++)
你正试图访问一个无效的内存(当你已经运行了有效的内存位置时),它会调用undefined behavior。
您可能希望将NULL作为sentinel值,方法是将大括号括起来的初始化列表的最后一个元素。像
这样的东西char *cities[] = {"Adiyaman","Kayseri","Istanbul", NULL}; //explicit NULL
答案 1 :(得分:1)
按以下方式定义数组
char *cities[] = { "Adiyaman","Kayseri","Istanbul", NULL };
否则循环将不起作用,因为该数组没有等于NULL的元素。
以下列方式编写循环会更简单
for ( i = 0; i != sizeof( cities ) / sizeof( *cities ); i++) {
puts( cities[i] );
}
或者如果你想使用指针那么
for ( char **p = cities; p != cities + sizeof( cities ) / sizeof( *cities ); p++) {
puts( *p );
}
答案 2 :(得分:0)
请检查char * name [] = {&#34; Bangladesh&#34;,&#34; Srilanka&#34;,&#34; Pakistan&#34;,&#34; India&#34;,NULL} ;