不确定go
的顺序为什么在我的main
函数内部的这个简单循环中很重要:
int go = 1;
int choice;
char *n;
while(go){
printf("1: insert letter into tree\n");
scanf("%d", &choice);
if (choice == 1)
{
printf("enter letter: ");
scanf("%s", n);
printf("%s\n", n);
}
}
我遇到了细分错误。但是当我这样写的时候,
int choice;
char *n;
int go = 1;
while(go){
printf("1: insert letter into tree\n");
scanf("%d", &choice);
if (choice == 1)
{
printf("enter letter: ");
scanf("%s", n);
printf("%s\n", n);
}
}
,底部有go
,它可以正常工作。无论如何,我通常都会在全局范围内定义go
之类的变量,但是我希望能对为什么在主函数中发生这种现象有任何见解。
答案 0 :(得分:6)
这里的内容是未定义的行为,因为您正在读取char*
,而没有为其分配内存。
char *n; //no memory allocated.
scanf("%s", n); //reading into n here.
答案 1 :(得分:3)
两个版本都没有为n
分配内存,因此您的行为不确定。
要避免使用动态分配的内存,您可以执行以下操作:
char n[32]; /* pick a number bigger than the strings you expect */
scanf("%s", n);
或使用malloc
来获取一些内存
char* n = malloc(32);
如果您输入分配的内存允许的更多字符,两种方式都会出现问题。
答案 2 :(得分:0)
问题是n没有分配内存。因此,当您在n中读取并分配一个值并在其后声明go时,它将覆盖go的内容。当您访问go时,它将生成段错误。
如果将其向上移动,它仍在进行OOB写入,但不知道在哪里。但是go并没有被触及,并且有效。