realloc()的:重新分配,以腾出空间对char strcat的无效时下一尺寸*

这个问题已经在这里有一个答案:

  • 面对一个错误“glibc的*** ***检测免费():无效的下一个尺寸(快速)”1回答

我在下面的代码获取无效的内存错误:

printf(" %s\n","FINE 5"); printf("%s LENGTH IS: %d\n","FINE 6",strlen(": ")); buffer = (char *)realloc(buffer, strlen(buffer)* sizeof(char) + (strlen(": ")+1)* sizeof(char)); printf(" %s\n","FINE 7"); strcat(buffer, ": ");

输出:

FINE 5
FINE 6长度:2
* glibc的检测 ./auto:realloc的():无效的下一个大小:0x08cd72e0 * =======回溯:========= /lib/tls/i686/cmov/libc.so.6 (+ 0x6b591)0x6dd591]

这里要注意的一点是Fine 7从不打印。 并且在每次运行无效的下一个尺寸误差是在同一位置。

发现这个relavent

--------------解决方案-------------

因为你的代码的其他部分已损坏堆出现此错误。 我们不能告诉你是什么错误没有看到代码的其余部分。

这一事实FINE 7不打印告诉你realloc失败。 而这失败一定是因为buffer是无效的,由于先前在执行堆损坏。



正交你的实际问题, sizeof(char)1的定义是很有意义从代码中删除它。

大卫赫弗南指出的那样,你的根本问题必须在其他地方是一个野指针在代码粉碎堆。

有几个值得其他的事情在这段代码SNIPPIT想着,虽然:

  1. 没有必要在新的大小表达式sizeof(char)的,为的sizeof(char)的,顾名思义,1。
  2. 切勿realloc的返回分配直接回唯一的指向你重新分配缓冲区。 如果realloc的上的错误返回NULL,你会失去你的指针旧缓冲区,并获得你自己的内存泄漏。 你总是想要做的适当当量:

    footype *p = realloc(oldbuff, newsize);
    if (!p) {
    handle_error();
    } else {
    oldbuff = p;
    }
  3. 在C语言中,无效*将自动转换到分配正确的类型,有没有必要投。 此外,通过铸造,在某些情况下,你会不会当你忘了,包括有问题的函数的声明得到有用的错误消息。
  4. 字符串包括隐含NUL终止符。 你想说的话:

    的strcat(缓冲器,“:”);

在向上的一面,strcat的会停在第一个空字符,所以在这种情况下,没有坏处。

(char *)realloc(buffer, strlen(buffer)* sizeof(char) + (strlen(": ")+1)* sizeof(char));

应该

(char *)realloc(buffer, (strlen(buffer) + strlen(": ") + 1) * sizeof(char));

它不应该? 你是数学字符串的长度是错误的。

分类:C# 时间:2015-03-15 人气:0
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 1.017 (s). 10 q(s)