【发布时间】:2016-07-16 12:01:32
【问题描述】:
我是 C 的初学者。这是一个简单的程序,它提示输入键盘输入的名称,使用该名称创建一个问候语,然后将其打印出来。在运行时,在控制台输入名称并按回车后立即发生分段错误。调试后,我怀疑问题出在 scanf() 函数上。我尝试使用“*”和“&”调整参数“name”,并使用空字符串初始化 char 数组“name”,但这些都没有帮助。
// Prompt for a name and print a greeting using the name.
#include <stdio.h>
#include <string.h>
int main()
{
// Prompt for a name.
printf("What is your name? ");
// Get the name.
char name[20];
scanf("%s", name); // Suspect segfault occurs here...
// Construct the greeting.
char *greeting;
char *suffix;
greeting = "Hello, ";
suffix = ", nice to meet you!";
strcat(greeting, name);
strcat(greeting, suffix);
// Display the greeting.
printf("%s", greeting);
return 0;
}
【问题讨论】:
-
Suspect segfault occurs here...我以为你说你会运行调试器?这将清楚地表明段错误发生的位置,而不存在。如前所述,这是因为您正在尝试使用常量数据(即 UB)来做事。无论如何,当您可以简单地执行const char c[] = "stuff";时,无需执行char *c; c = "stuff";的两个步骤 - 这使得您在此处处理只读内存的概念更加清晰。 -
@underscore_d:
char *c; c = "stuff";的捷径是char * c = "stuff";。你的提议显着改变了局面。 -
@alk 当然,这更字面意思。如果由于 C++ 更适合我而忘记了一些基本的东西,我深表歉意 - 有什么重大变化?考虑到 C 急切地将数组名称转换为指向其第一个元素的指针,名称
c在大多数情况下将具有相同的语义。但如果有的话,它似乎更好,因为您可以使用它来获取sizeof字符串(包括空终止符)。 -
@underscore_d:哦,是的,很公平,我忽略了
const。然而,与 C++ 相比,这在 C 中并不是什么大问题。仍然指针不是数组。 -
好吧,好吧,我的评论“不过在 C 中这不是什么大问题”是废话,因为写入
const变量会引发 UB。
标签: c segmentation-fault scanf