【发布时间】:2017-11-16 19:33:35
【问题描述】:
我的代码中有以下 typedef:
typedef char * string;
我需要让用户输入一个字符串,这样我才能解析它并在以后使用其中的内容。如果我只是用这个定义声明一个字符串,它就可以工作,就像这样:
string bob = "My name is bob!;
printf("%s\n", bob);
在使用它时我应该使用什么来获取用户输入,scanf() 和 fgets() 当我尝试使用它们时,它们都给我 Segmentation fault (core dumped) 错误。
这是给学校的,这就是为什么我需要以这种方式使用 typedef。
【问题讨论】:
-
问题不在于你的 typedef;你可以像写
char *一样使用它。问题是目标:使用字符串文字初始化bob时,它通常驻留在不可写内存中,因此存在段错误(从技术上讲,它是UB)。尝试用malloc()初始化它 -
字符串文字在只读内存中。你不能改变它们。所以也不能在 scanf 中使用。使用
char str[MAXSIZE]或char *str =malloc(sizeof (char) *MAXSIZE)。尝试修改只读内存是未定义的行为。还有malloc,当你分配..检查返回值,也不要忘记free他们。在这种情况下,正如您所说typedef has problem...不,它没有。typedef应该用于您想要使用的复杂类型...这里因为typedef-ingchar*而失去可读性。 Segfaults-由程序试图读/写非法内存引起 -
在C语言中
typedefa pointer不是一个好主意。 -
@coderredoc 详细信息:“字符串文字在只读内存中”几乎是正确的,并且对学习者来说是一个有用的公理。然而,C 中没有只读内存要求。写入 string literal 可能“有效”,但可能不会。毕竟是UB。
-
非常感谢大家的回答,他们帮了大忙!