c - C 中字符串的 printf 的意外输出

标签 c pointers char-pointer

案例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;
}

我发现这件事很奇怪,想知道为什么会发生...... 提前致谢。

最佳答案

这两种情况都不正确。

情况 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;
}

关于c - C 中字符串的 printf 的意外输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40899122/

相关文章:

c++ - 如何在 C++ 中访问有关内存的元数据

C++ MFC : Memory Leak When Creating CString From Char*

在apple darwin中创建GNU C环境

c - 给定起始和结束索引,如何在 C 中复制字符串的一部分?

c - 如何使用 pthreads 以对具有约束的数组执行同时操作?

c++:类继承层次结构中指针数据成员的行为

c - 如何将 (long *) 转换为二维 long 数组

c - 如何查找 char** 数组中的元素个数?

c++ - int8_t* 和 char*

c - size_t 或 long 表示包含文件的字符串的大小?