-6

案例1:当我输入字符串时,它成功地给出了输出,写了这段代码:

#include <stdio.h>
int main()
{
    char *str;
    scanf("%s",&str);
    printf("%s",&str);
    return 0;
}

案例 2:另一方面,它会为此代码段引发运行时错误:

#include <stdio.h>
int main()
{
    char *str;
    scanf("%s",&str);
    printf("%s",str);
    return 0;
}

我发现这件事很奇怪,想知道它为什么会发生……在此先感谢。

4

1 回答 1

2

这两种情况都不对。

案例 1 之所以有效,是因为您很幸运,可能是通过提供一个字符串作为输入。尝试类似的东西"bfjabfabjkbfjkasjkvasjkvjksbkjafbskjbfakbsjfbjasbfjasbfkjabsjfkbaksbfjasbfkja",你很可能会遇到段错误。

您应该有一块与 相关联的内存str,可以在堆栈上为它声明一个数组,也可以在它的堆malloc内存上。

而且您不应该使用&运算符。

所以它会是这样的:

#include <stdio.h>
int main()
{
    char str[50];   // 50 is arbitrary
    scanf("%s",str);
    printf("%s",str);
    return 0;
}

或像这样:

#include <stdio.h>
#include <stdlib.h>
int main()
{
    char* str = malloc(50);   // 50 is arbitrary
    scanf("%s",str);
    printf("%s",str);
    free(str);
    return 0;
}
于 2016-11-30T22:22:15.630 回答