-2

不知道为什么在我的函数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,但我希望能深入了解为什么会在主函数内部发生这种情况。

4

3 回答 3

6

您在这里拥有的是未定义的行为,因为您正在读取 achar*而没有为其分配内存。

char *n; //no memory allocated.

scanf("%s", n); //reading into n here.
于 2018-11-30T04:33:26.307 回答
3

这两个版本都没有分配内存n,所以你有未定义的行为。

为避免使用动态分配的内存,您可以执行以下操作:

char n[32]; /* pick a number bigger than the strings you expect */
scanf("%s", n);

或者malloc用来获取一些内存

char* n = malloc(32);

如果您输入分配的内存允许的更多字符,这两种方式都会出现问题。

于 2018-11-30T04:32:10.907 回答
0

问题是 n 没有分配内存。所以当你在 n 中读取并赋值并在它之后声明 go 时,它会覆盖 go 的内容。当你访问 go 时,它会产生 seg 错误。

如果你向上移动它,它仍然在做OOB写但不知道在哪里。但是 go 没有被触及,它可以工作。

于 2018-11-30T04:44:04.850 回答