【问题标题】:C - Seg Fault on Strcpy()C-Strcpy() 上的 Seg 错误
【发布时间】:2018-10-03 01:52:53
【问题描述】:

我正在尝试以下方法为键分配一个值,该键是结构的一部分。 Key 是指向 char 的指针。

T->oa[i].key = (char*)malloc(5*(sizeof(char)));
strcpy(T->oa[i].key,"abc");

当我运行它时,我在 strcpy 行上遇到了一个段错误。这里发生了什么?谢谢。

【问题讨论】:

  • malloc 是否返回非 NULL?
  • 请将其转为minimal reproducible example,缺少一些声明/定义。
  • @Yunnosch 我如何检查它的回报?如果它返回 NULL 那意味着什么?
  • 约翰,看我的回答,你只需要添加 doSomethingIntelligent() 位,这取决于你的特殊需要:-)
  • 请不要将这个malloc 转换成C。

标签: c string malloc strcpy


【解决方案1】:

代码段可能导致问题的唯一方法是malloc 实际失败(返回NULL)。

除此之外,应该没有问题。任何可能失败的调用都应该检查,如果失败可能会在以后导致问题,并且内存分配然后取消引用该内存肯定属于该描述。

更好的解决方案是这样的:

T->oa[i].key = malloc(5);
if (T->oa[i].key == NULL)
    doSomethingIntelligent();
else
    strcpy(T->oa[i].key, "abc");

您会注意到我还更改了malloc 调用。在 C 中,从 malloc 转换返回值很少是一个好主意,因为:

  • 返回的void * 可以隐式强制转换为任何其他指针;和
  • 它可能会导致某些细微的错误。

此外,您从不需要乘以sizeof(char),因为根据定义,它总是一。

【讨论】:

  • 这个实现成功了。不知道 malloc 可能会失败,尤其是在程序中只调用它的那个。谢谢。
  • @John:哇!我认为一个单独的malloc 不太可能在程序中失败,除非满足以下条件之一:(1) 而不是只有一次实际调用 malloc,你的意思是只有一个调用,但它被调用了很多而没有释放,这意味着你最终会耗尽内存; (2)你在一个不允许动态内存分配的受限环境中工作(比如我工作过的一些实时嵌入式系统);或 (3) 其他东西,只是为了涵盖所有选项,让我看起来更聪明:-)
  • 我自己真的不敢相信,我对任何忽略返回值的问题的硬连线反射实际上会导致解决方案......
猜你喜欢
  • 2015-04-11
  • 2012-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-21
  • 2013-02-23
  • 1970-01-01
相关资源
最近更新 更多