C感到困惑?声明顺序导致分段错误

时间:2018-11-30 04:28:25

标签: c segmentation-fault

不确定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之类的变量,但是我希望能对为什么在主函数中发生这种现象有任何见解。

3 个答案:

答案 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并没有被触及,并且有效。