我最近在这里回答了一个问题,其中问题是输入几个代码句并打印出来。我的代码是这样的:为什么即使在我没有分配内存时也能工作?
#include<stdio.h>
int main() {
clrscr();
int line, i;
char (*string)[100];
printf("How many line?\n");
scanf("%d",&line);
getchar();
for(i=0;i<line;i++) {
gets(string[i]);
}
printf("You entered:\n");
for(i=0;i<line;i++) {
puts(string[i]);
}
return 0;
}
正如你看到的,我还没有分配的任何内存到各个串即s[0]
,s[1]
,......但令人惊讶的我的编译器没有给我任何的警告或它的错误,它完美的作品。
所以我发布了这个代码,坦白地说它有很多downvotes(我知道我配得上它)。你能解释为什么这个代码可以工作,而不是给出分割错误吗?
我的输出如下所示:
这只是未定义的行为。段错误或崩溃是没有必要的。并且不要使用'gets'。你知道为什么。另外,如果您使用'clrscr()',请包含'conio.h' –
C和C++都删除'gets'。我强烈建议不要使用它。你可能想知道'string'是一个指向100个字符数组的指针,而不是100个char *数组。 – chris
纯粹的运气不好,它没有崩溃。请参阅[为什么'gets()'太危险了](http://stackoverflow.com/questions/1694036/why-is-the-gets-function-dangerous-why-should-it-not-be-used )。 –