gpt4 book ai didi

c - Realloc 无法将 1 动态增长到超过一百万个元素

转载 作者:太空宇宙 更新时间:2023-11-04 08:24:26 25 4
gpt4 key购买 nike

读取一个 2 列的文本文件并将 long int 值存储到一个动态重新分配的数组中,当数组增长到超过 20 万次内存重新分配时失败。

    long int load_list_unklen(long int (**ptr), FILE *infname)
{ long int row =0;
char buf[64];
while (fgets (buf, sizeof(buf), infname)) {
// M is defined to be = 2
*ptr = (long int *)realloc(*ptr, M * row+1 * sizeof(ptr));
if(!ptr) {
perror("Out of memory");
free(ptr);
exit( 1); }
sscanf(buf, "%ld\t%ld", &(*ptr)[row*2],&(*ptr)[row*2+1]);
row += 1;
}
if (ferror(infname)) {
fprintf(stderr,"Oops, error reading stdin\n");
abort();
}
return row;
}

请注意,buf 获取一个字符串,该字符串包含两个由制表符分隔的数字。代码失败,因为它尝试加载一个超过 200 万行的文件并且行增量停止在 221181 左右,因此我想知道 realloc 阻塞是否有限制?我应该以不同的方式调用 realloc 吗?

下面是我调用函数的方式:

long int *act_nei = (long int *)malloc(M * sizeof (act_nei) );
const long int sz = load_list_unklen(&act_nei, fp);

使用 SO 帖子中的代码重新分配内存槽,我的示例是针对大型输入文件的。
Realloc and sscanf into a function Realloc and scanf

最佳答案

您正在通过超出分配空间的写入来破坏 malloc 环。缺少 () 和错误的 sizeof。尝试:

*ptr = (long int *)realloc(*ptr, M * (row+1) * sizeof(**ptr));

关于c - Realloc 无法将 1 动态增长到超过一百万个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31428351/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com