我写了一个非常基本的代码,似乎无法让它工作。
char *a;
scanf("%s",a);
printf("%s",a);
输入:aWord
输出:空
我在哪里错了?为什么我得到空输出? 我尝试了以下操作,它按预期工作,为什么会这样?
char a[50];
scanf("%s",a);
printf("%s",a);
输入:aWord
输出:aWord
我认为使用上述两种方法在c中声明一个字符串是等效的吗?
答案 0 :(得分:2)
char *a;
此处,a
只是char*
类型的指针。它指向一些"随机"地点。没有任何内存分配给它。写入此无效内存位置会调用Undefined Behavior。只有在
a
/ malloc
动态分配calloc
的内存。 a
指向有效的内存位置:
char buffer[100];
a = buffer;
// Now you can write to `a`.
下面:
char a[50];
内存自动分配给堆栈上的a
。所以,你可以写到这个内存位置。
答案 1 :(得分:0)
TL:DR - 您的第一个代码段生成undefined behaviour,您的第二个代码段有效。
案例1:
char *a;
scanf("%s",a);
printf("%s",a);
此处,a
未初始化。在scanf()
中使用它会调用UB。
案例2:
char a[50];
scanf("%s",a);
printf("%s",a);
这里,a
是正确分配的内存(在编译时本身)。因此,它可以安全地与scanf()
一起使用。
但是,我建议使用
scanf("%49s",a);
以避免可能的内存溢出。