c - *** 检测到 glibc *** ./all : realloc(): invalid next size: 0x0804b008 ***

标签 c malloc expand dynamic-arrays realloc

<分区>

我正在尝试复制动态分配数组中的整数数组。一开始它的大小为 1,对于每个元素我都想将它的大小增加一个。

代码如下:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int *nr,i;
    nr=(int *)malloc(1*sizeof(int));
    for(i=1; i<1000; i++)
    {
        nr[i]=i;
        nr=(int *)realloc(nr,i*sizeof(int));

    }

    for(i=1; i<1000; i++)
        printf("%d \n", nr[i]);

    return 0;
}

谢谢!

最佳答案

此处:nr=(int *)malloc(1*sizeof(int));

您只分配了 4 个字节,但在您的 for 循环中,您随后写入了 4000 个字节,其中 3996 个字节在未分配给您的内存中。你正在做的 realloc 没有做任何事情,因为你仍然只要求 4 个字节。

杀掉realloc,只在开头分配1000*sizeof(int)

为您的编辑而编辑:

因为您的循环来自 i=1,所以在第一次迭代中您要写入字节 4-7 而不是 0-3,因此您需要从 i=0。但是你的 realloc 也是错误的,因为即使在你的循环中你也在分配 1*sizeof(int),这意味着你仍然是一个短缺。您需要从 int i=0 循环并使用 (i+2)*sizeof(int) 重新分配。

但是

不要在循环中重新分配,malloc 和 realloc 非常慢。如果你用大量的真实问题来做这件事,你就会在这里遇到瓶颈。分配一次,使用它。即使你不能那样做,在一个循环中计算你需要多少空间,做一个单独的 malloc,然后使用另一个循环来填充它,它会明显更快。

关于c - *** 检测到 glibc *** ./all : realloc(): invalid next size: 0x0804b008 ***,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23582299/

相关文章:

c - 用openssl EVP在C中解密aes ccm 128,mic 8bit

c - 双指针运算,遍历数组字符串的字符

编译器警告 "result of malloc is converted to a point incompatible with sizeof operand type"

html - CSS <div> 没有向下延伸整个页面

java - JPercientTree(JTree,boundtree)将路径扩展到给定节点

c - 对哈希表进行排序 Glib - qsort

c++ - 我如何解析 H264 文件和帧

c - 重新分配字符串数组

c - malloc 后访问冲突

python - 如何使用 Python 轻松将变量扩展为字符串?