指针数组,停止运行

时间:2016-03-27 19:39:21

标签: c pointers for-loop multidimensional-array

为什么这会在编译后停止运行。它正确地给出输出,但在它之后它会腐败。

    #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;
}

3 个答案:

答案 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} ;