不确定为什么go
的顺序在我的main
函数中的这个简单循环中很重要:
int go = 1;
int choice;
char *n;
while(go){
printf("1: insert letter into treen");
scanf("%d", &choice);
if (choice == 1)
{
printf("enter letter: ");
scanf("%s", n);
printf("%sn", n);
}
}
我有一个分割错误。但当我这样写的时候,
int choice;
char *n;
int go = 1;
while(go){
printf("1: insert letter into treen");
scanf("%d", &choice);
if (choice == 1)
{
printf("enter letter: ");
scanf("%s", n);
printf("%sn", n);
}
}
在go
位于底部的情况下,它可以按预期工作。无论如何,我通常会全局定义go
之类的变量,但如果能深入了解为什么会在主函数中发生这种情况,我将不胜感激。
这里有未定义的行为,因为您正在读取char*
而没有为其分配内存。
char *n; //no memory allocated.
scanf("%s", n); //reading into n here.
两个版本都没有为n
分配内存,因此您有未定义的行为。
为了避免使用动态分配的内存,您可以执行以下操作:
char n[32]; /* pick a number bigger than the strings you expect */
scanf("%s", n);
或者使用malloc
获取一些内存
char* n = malloc(32);
如果您输入的字符超过了分配的内存所允许的数量,那么这两种方法都会出现问题。
问题是n没有分配内存。因此,当你读取并分配n中的一个值,然后在它之后声明go时,它就覆盖了go的内容。当您访问go时,它会生成seg错误。
如果你把它向上移动,它仍然在进行OOB编写,但不知道在哪里。然而go并没有被触碰,它是有效的。