我正在学习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
循环?当我发表评论时,我看到了所有的论点。
答案 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++;
在分配之前为下一个字符腾出空间。