C代表困惑?声明顺序导致分段错误



不确定为什么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并没有被触碰,它是有效的。

相关内容

  • 没有找到相关文章

最新更新