【问题标题】:Can someone explain to me why this code give me a Seg Fault.? [closed]有人可以向我解释为什么这段代码会给我一个 Seg Fault。? [关闭]
【发布时间】:2018-04-15 06:50:24
【问题描述】:

有人能解释一下为什么这段代码给我一个段错误吗?

char  cmd[MAXSIZE];
char* args[2];
fgets(cmd, MAXSIZE, stdin);
// read_line(cmd);
char* cmdPt = cmd;
printf(cmdPt[0]);

然后当我:

printf("%c", cmdPt[0])

它没有给我的段错误。

【问题讨论】:

  • cmdPt[0]类型是什么?第一个参数printf 期望的类型是什么?
  • 不要使用没有格式字符串的 printf()!想想如果你打印的字符串包含格式说明符会发生什么......

标签: c segmentation-fault


【解决方案1】:

问题出在printf() 语句中。

printf(cmdPt[0]); 应该是printf(cmdPt); 因为printf() 第一个参数是const char *format 即您应该提供char 数组基址 而不是单个字符。

正确阅读编译器警告,您可以找到自己的解决方案。

预期为“const char * restrict”,但参数的类型为“char”

最好使用带有格式字符串的printf()。正如 cmets 中所建议的,您应该始终使用标志 -Wall -pedantic-errors 编译代码,这对您有很大帮助。

【讨论】:

  • 更好的是,使用-pedantic-errors 进行编译,这些一致性警告将变成错误。
  • 我没有收到@StoryTeller。你想说如果我用-pedantic-errors 选项编译,警告会变成错误吗?我明白了,-Wall 还不足以表示警告。
  • 该警告是表明程序违反 ISO C 约束的众多警告之一。但是可以忽略警告(如果它们甚至默认显示)。为了获得严格的一致性,我喜欢添加-pedantic-errors 标志。它小于-Werror(IMO 有点过于严格了)。
  • @alk - 你或我会修复这些警告。学习者(就像 OP 一样)不会。最好从错误开始,以便轻松养成好习惯。
  • @StoryTeller:很公平。我最喜欢的选项是:-Wall -Wextra -pedantic -Wconversion。后者更多是为了仔细检查我个人在混合类型方面的草率。我只根据具体情况修复它警告的代码。我不在生产版本中使用它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-20
  • 1970-01-01
  • 2015-08-31
  • 1970-01-01
  • 2011-05-31
  • 2019-02-01
相关资源
最近更新 更多