3

我正在学习 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循环?当我将其注释掉时,我会看到打印的所有论点。

4

2 回答 2

9

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

char *states[argc];

这样做的原因如下:char *states[] = {};创建一个由零元素组成的数组,因此任何取消引用states[i]都是未定义的行为。

于 2013-07-21T22:35:13.663 回答
0

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

char *states[argc];

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

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

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

于 2013-07-21T22:56:35.003 回答