gpt4 book ai didi

c - 无效免费或腐败出局

转载 作者:行者123 更新时间:2023-11-30 16:01:48 25 4
gpt4 key购买 nike

我是 C 语言新手,完全被这个问题迷惑了。这是一项家庭作业,旨在用 C 语言实现类似 pagerank 算法的功能。

我试图通过二维指针数组记录来自其他页面的链接。我的程序工作得很好,并且很高兴地计算大量链接的页面排名,但是,每当我尝试释放我的链接数组时,我都会收到“无效的免费”错误。

示例代码:

struct webpage {
char name[20];
int links_out;
struct webpage **links_in; //to hold pointers to pages.
int index; //stores the position in the pre-sorted array
// as I have to print it out in this order
};

static struct webpage *pages = NULL;

这是我的数据结构。读入一些基本变量(例如页数(npages))后,我分配内存

pages = (struct webpage *)calloc(npages, sizeof(struct webpage));

当我在每个网页中阅读时,我分配内部二维数组 links_in 如下

pages[counter].links_in = (struct webpage **)calloc(npages, sizeof(struct webpage *));

然后里面的每个页面:

for(i =0; i< npages; ++i)
pages[counter].link_in[i] = (struct webpage *)calloc(1, sizeof(struct webpage));

我对网页数组进行排序。然后读取链接信息并使用 bsearch 对我的数组进行二分搜索,以获得指向每个所需页面的指针。

struct webpage *temp_in;
struct webpage *temp_out;

temp_in = bsearch(temp_str, pages, npages, sizeof(struct webpage), struct_cmp_by_name);
temp_out = bsearch(temp_str2, pages, npages, sizeof(struct webpage), struct_cmp_by_name);

然后我分配

temp_in->links_in[temp_out->index] = temp_out;

这一切都很好,我能够访问所有所需的数据来计算页面排名。完成后,我尝试按如下方式释放内存:

for(int i = 0; i < npages; ++i){
for(int k = 0; k < npages; ++k){
if(pages[i].links_in[k] != NULL){
free(pages[i].links_in[k]); //this line is causing the error
pages[i].links_in[k] = NULL;
}
}
free(pages[i].links_in);
}

第一次调用时,k 循环内对 free 的调用会抛出无效的 free(或双重释放损坏)错误。

我已经用 gdb 仔细检查了代码,一切似乎都指向正确的方向。 gdb 将该行列为程序中断点。

valgrind 的说法大致相同:

Invalid free() / delete / delete[]
at 0x4A05187: free (vg_replace_malloc.c:325)
by 0x4009C4: memory_dump (pagerank.c: 87) // this is the line free(pages[i].links_in[k];
by 0x4013F2: seq_check_condition (pagerank.c:355)
by 0x40162F: main (pagerank.c:418)

在此之前我绝不会删除/释放该(或任何内存)内存。

感谢您的任何建议。

最佳答案

我猜这就是问题所在:

temp_in->links_in[temp_out->index] = temp_out;

看来您已经为所有“links_in”指针分配了内存 - 然后您正在更改该指针以指向您已分配的另一位内存。

也许你想要这样的东西:

memcpy(temp_in->links_in[temp_out->index], temp_out, sizeof(struct webpage));

...或者进行一些重新设计?

关于c - 无效免费或腐败出局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6058800/

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