为什么这项任务会破坏我的计划?

时间:2013-07-21 22:33:19

标签: c

我正在学习C而且我不确定如何表达这一点,但为什么在以下代码中取消注释第11行会破坏这个程序?

#include <stdio.h>

int main(int argc, char *argv[])
{
    printf("argc: %d\n", argc);

    char *states[] = {};
    int i = 0;
    while(i < argc) {
        printf("arg %d: %s\n", i, argv[i]);
        //states[i] = "test";  
        i++;
    }


    return 0;
}

当我取消注释这一行并运行程序时,我得到了这个:

greggery@Lubu:~/code$ ./myprog aaa bbb ccc
argc: 4
arg 0: ./lc
arg 1: aaa

为什么states[i] = "test";打破while循环?当我发表评论时,我看到了所有的论点。

2 个答案:

答案 0 :(得分:9)

它因数组states为空而中断。使其大小为argc(在C99中允许)以解决问题:

char *states[argc];

原因如下:char *states[] = {};生成一个零元素数组,因此任何解除引用states[i]都是未定义的行为。

答案 1 :(得分:0)

您需要为字符数组分配内存。如果argc是您要存储的字符数:

char *states[argc];

作品。或者,如果要动态扩展它,可以使用堆,保留计数器变量并在循环中添加以下内容:

states = (char *) realloc(sizeStates + sizeof(char));
sizeStates++;

在分配之前为下一个字符腾出空间。