【问题标题】:realloc() : invalid next size for char* variablerealloc() : char* 变量的下一个大小无效
【发布时间】:2020-06-30 04:26:46
【问题描述】:

这是一个将十进制的二进制格式返回为char *的函数。

char* getbinnumbydec(unsigned int a)
{
    char * s;
    unsigned int ost = 0;//remainder of the division variable
    bool loop = true;

    s = (char *)malloc(1);
    while(loop)
    {
        if(a<=1)
            loop = false;

        ost = a%2;//remainder of the division
        a = a/2;

        s = (char*)realloc(s, 2);
        if(ost == 0)
        {
            strcat(s, "0 ");
        }
        else
        {
            strcat(s, "1 ");
        }

    }
    reverse(s, 0, strlen(s)-1);
    strcat(s, "\0");
    return s;
    //returns for example 1 0 1 0 (with space separator)
    //if 10 (decimal) was transfered to this function

而且它有效。但是如果我将一个大于 8191 的数字传递给这个函数,则会显示一条错误消息:

*** Error in `./bin': realloc(): invalid next size: 0x0000000000f67010 ***
Aborted

有人可以帮我解决吗?

【问题讨论】:

  • 你能给我们足够的代码来编译和运行来复制错误吗?
  • 有点,你用reallocs 让这一切变得不必要的复杂和低效。您必须检查您的架构,但unsigned int 可能是 4 字节 32 位。您希望每 4 位有一个空格,因此最多有 7 个空格,再加上一个用于 NUL 终止符的空格,总共 40 个字节。内存很便宜,只需分配您可能需要的最多并使用它即可。例如,100 对便携性来说已经绰绰有余了。

标签: c malloc realloc


【解决方案1】:

第一个问题:

strcat 函数需要一个字符串作为其第一个参数。但是第一次调用strcat 时,s 可能包含也可能不包含字符串。在s 的第一个malloc 之后,您需要一个*s = 0;

第二个问题:

您第一次通过循环时,您重新分配了两个字节。然后您尝试将“0”复制进去。但是保存该字符串需要三个字节('0',''和终止的零字节)。所以你没有分配足够的空间。

第三题:

strcat(s, "\0");

strcat 函数需要一个字符串作为其第一个参数。根据定义,字符串以零字节结尾。所以这没有任何意义。要知道将零字节放在哪里,它必须搜索现有的零字节,所以必须已经存在一个零字节,否则这是非法的。

【讨论】:

    猜你喜欢
    • 2020-12-27
    • 1970-01-01
    • 2014-10-13
    • 2015-01-22
    • 1970-01-01
    • 2016-03-19
    • 2011-02-25
    相关资源
    最近更新 更多