扫描并打印字符串

Scan and Print a string

我写了一个非常基本的代码,但似乎无法让它工作。

char *a;
scanf("%s",a);
printf("%s",a);

输入:一个字

输出:空

我哪里错了?为什么我得到空输出? 我尝试执行以下操作并且它按预期工作,为什么会这样?

char a[50];
scanf("%s",a);
printf("%s",a);

输入:一个字

输出:一个字

我认为使用上述任何一种方式在 c 中声明一个字符串是等效的?

char *a;

这里,a只是一个char*类型的指针。它指向某个 "random" 位置。没有分配给它的任何内存。写入此无效内存位置会调用 Undefined Behavior。仅当

时,您才能写入此位置
  1. a 的内存是使用 malloc/calloc 动态分配的。
  2. a 指向一个有效的内存位置:

    char buffer[100];
    a = buffer;
    
    // Now you can write to `a`. 
    

这里:

char a[50];

内存自动分配给堆栈上的 a。因此,您可以写入此内存位置。

TL:DR -- 您的第一个代码片段生成 undefined behaviour,您的第二个代码片段有效。

案例一:

char *a;
scanf("%s",a);
printf("%s",a);

此处,a未初始化。在 scanf() 中使用它会调用 UB。

案例二:

char a[50];
scanf("%s",a);
printf("%s",a);

这里,a 是正确分配的内存(在编译时本身)。因此,它可以安全地与 scanf() 一起使用。

不过,我会建议使用 like

scanf("%49s",a);    

避免可能的内存溢出。