【问题标题】:C:string getting corrupted between malloc and strcpyC:字符串在 malloc 和 strcpy 之间损坏
【发布时间】:2013-11-12 09:00:02
【问题描述】:

我很困惑为什么会发生这种情况,尽管我之前已经使用过这样的陈述。我只是简单地将一个字符串复制到另一个字符串中,而我的原始字符串已损坏,甚至在strtok 被调用之前。这是相关代码sn-p,之后我使用strtok。但在此之前,我看到 reference 已损坏。

int j, sizeref;
char *str1, *token;

printf("%s :", reference);
sizeref = strlen(reference);
printf("%d\n", sizeref);
track = malloc(sizeref);
printf("%s :", reference);
strcpy(track, reference);
printf("%d\n", strlen(track));

这是下面的输出。第一行打印整个reference,正确大小为234。之后我看到只有106 个字符被复制,原始字符串reference 也被截断为106 个字符。 track 被声明为char *

+918956549122,9527529747,09847778399,08596774833,9867859469,+919999866778,6985888696,5968939898,6959869856,9898495895,6986596865,09847765399,88596774833,9967859469,+917899866778,6985889696,9527567747,09848778399,08596756733,9867999469 :234
+918956549122,9527529747,09847778399,08596774833,9867859469,+919999866778,6985888696,5968939898,69598698 :106

更多信息: 参考以 50 字节为单位逐渐增加。一旦完全建成,则只能按上述方式使用。 char * reference 是全局的,并且在 main 内部建立起来。上面提到的代码在一个单独的函数中

realloc(reference,strlen(reference) + CHUNK);

【问题讨论】:

  • track = malloc(sizeref + 1)... 您没有为 NUL 终止符分配空间。除此之外,您的程序还有另一个 UB。 strlen() 返回 size_tnot int,因此您必须使用 %zu 而不是 %d 打印它。
  • @H2CO3 你有时为我节省了很多该死的打字。总有一天我要回报那个人情=P
  • @WhozCraig :D 很公平。

标签: c malloc strtok strlen strcpy


【解决方案1】:

根据 strlen() 上的手册:

DESCRIPTION
       The  strlen()  function calculates the length of the string s,
       excluding the terminating null byte ('\0').

因此,如上所述,您应该分配大小为 strlen() + 1 的缓冲区以正确终止 null。

【讨论】:

  • 是的,这是真的,但这将如何解决这个问题。我试过 strlen()+1 ,结果还是一样。如果我不使用 +1,那么它至少应该分配 234 个字节,但它在 106 处停止......这很奇怪。
  • @DiwakarSharma 我刚刚用 strlen(.)+1 检查了你的一小部分代码,它工作得很好。我得到了这样的输出:%all the input numbers% : 236\n%all the input numbers% : 235。这是正确的(第二个 strlen 给了我们 236-1)。猜猜,如果你在代码的其他部分有一些错误。因此,如果您仍在处理这个问题 - 发布一些测试代码(用独立的 main() {} 包装),它尽可能小并且包含错​​误。那么请确保人们会帮助您。
  • 嗯,我已经改变了我的方法和逻辑,使其变得更好,并在那里发布了一个不同的问题。 stackoverflow.com/questions/19761453/…
【解决方案2】:

C 字符串以 null 结尾。将代码更改为track=malloc(sizeref + 1);,否则strcpy 将尝试将空终止写入有效内存之外。

【讨论】:

    【解决方案3】:

    您可能试图通过在函数中使用 sizeof 来获取数组的大小,其中数组衰减为指针并且 sizeof 仅返回指针的大小。

    【讨论】:

      猜你喜欢
      • 2013-03-17
      • 2013-06-10
      • 2011-02-08
      • 1970-01-01
      • 2014-10-01
      • 2011-07-14
      • 1970-01-01
      • 1970-01-01
      • 2011-07-18
      相关资源
      最近更新 更多