【问题标题】:Copying data from one pointer to another seg fault将数据从一个指针复制到另一个段故障
【发布时间】:2013-03-08 23:14:40
【问题描述】:

我对我的 C 技能有点生疏了,前几天我正在做一项作业,遇到了一些建议。我不知道为什么,但这完全把我难住了。所以,如果解决方案是微不足道的,请原谅我。

我编写了以下代码,将一个指针中的数据复制到另一个指针。我不想使用 memcpy、strcpy 或任何其他函数。

char *word = "hello world!";
char *ptra = NULL;

ptra = malloc(strlen(word) + 1);

for (; word != '\0'; word++, ptra++) {
    *ptra = *word;
}

*ptra = '\0';

现在,当我编译它时,我遇到了分段错误。有人可以帮我解决这个问题吗?

【问题讨论】:

  • 该错误很容易修复,但可能有点难以发现,特别是如果您是指针新手。别担心,它会变得更容易。此外,在您的内存分配中,+ 1 做得很好。这是人们(尤其是新程序员)忘记的东西,并且会导致各种难以追踪的错误。
  • 在程序中,您直接递增了指针,而没有进行复制。因此,即使在执行复制之后,您也可能无法使用该字符串,也无法在程序结束时释放内存。制作指针的副本会有所帮助。
  • 优点@Ganesh。
  • @NikBougalis 谢谢!!

标签: c pointers segmentation-fault


【解决方案1】:

您缺少一个取消引用:它应该是循环条件中的*word != '\0'

for (; *word != '\0'; word++, ptra++) {
    // ^ Here
    *ptra = *word;
}

由于word 是一个指针,它永远不会等于\0,因此您的循环将超过两个字符串的末尾。

【讨论】:

  • 另外,如果 OP 在使用之前养成检查malloc 的结果的习惯,那就太好了。
  • 非常感谢 das 和 Nik。尼克,我同意你的看法。我应该使用断言还是只使用 if 语句?所以我的意思是,在我 malloc 之后,我可以使用 'assert (ptra != NULL)' 或 'if (ptra == NULL) then print error message' 吗?
  • 您应该使用if 语句来处理此类事情。请记住,assert 通常只能在您的程序的“调试”版本中工作,当它失败时会导致程序立即退出。想想assert 说:“这件事应该永远发生,如果发生了,恐慌,举起双手,像个小女孩一样哭,等我!”内存分配失败并不真正(或者,我应该说通常)符合该标准。
  • 非常感谢您的时间和解释。
猜你喜欢
  • 2021-02-07
  • 2011-05-23
  • 2019-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-28
相关资源
最近更新 更多