gpt4 book ai didi

至少 375 次成功输入后出现代码段错误

转载 作者:太空宇宙 更新时间:2023-11-04 07:28:45 30 4
gpt4 key购买 nike

在我正在处理的哈希字典中,根据 GDB,数组的大小已从 500 调整到 1000。它在尝试添加时崩溃的数组索引是 799,所以它没有超出范围......我不是确定它为什么会出现段错误,尤其是在这样一条看似无害的线路上。这是相关代码。

int main(int argc, char **argv)
{
FILE *src = fopen(argv[1], "r");
int algnum = 1;
char input[40];
struct HT *table = create();


if (argc == 3)
{
if (strcmp(argv[2], "0") == 0)
{
algnum = 0;
}
else if (strcmp(argv[2], "1") == 0)
{
algnum = 1;
}
}

while(fgets(input, 40, src) != 0)
{
int i = 0;
while(input[i] != '\0')
{
i++;
}

struct word *wrd = malloc(sizeof(struct word));
wrd->letters = input;
wrd->length = i;
if (algnum = 0)
{
add(table, wrd, &alg0);
}
else if (algnum = 1)
{
add(table, wrd, &alg1);
}
}
}

然后在包含文件中...

struct HT* create() 
{
struct HT* table = malloc(sizeof(struct HT));
table->entries = 0;
table->num_buckets = 500;
table->largest_bucket = 0;
table->occupied_buckets = 0;
table->buckets = malloc(500 * sizeof(struct bucket*));
int i;
for (i = 0; i<500; i++)
{
table->buckets[i] = malloc(sizeof(struct bucket));
table->buckets[i]->num_items = 0;
}
return table;
}

struct HT* resize(struct HT* table, int(*alg)(struct word *wrd))
{
struct HT* table_new = malloc(sizeof(struct HT));
int new_size = 2*table->num_buckets;
table_new->buckets = malloc(new_size*sizeof(struct bucket*));
int i;
for (i = 0; i < new_size; i++)
{
table->buckets[i] = malloc(sizeof(struct bucket));
table->buckets[i]->num_items = 0;
}
table_new->num_buckets = new_size;
table_new->occupied_buckets = 0;
table_new->entries = 0;
table_new->largest_bucket = 0;

struct word* wrd_temp = malloc(sizeof(struct word));
struct item* item_temp = malloc(sizeof(struct item));
for (i = 0; i<table->num_buckets; i++)
{
item_temp = table->buckets[i]->head;
while(item_temp != 0)
{
wrd_temp = item_temp->wrd;
add(table_new, wrd_temp, alg);
item_temp = item_temp->next;
}
}
quit(table);
return table_new;
}

void add(struct HT* table, struct word *wrd, int(*alg)(struct word *wrd))
{
if ((double)table->entries / (double)table->num_buckets > .75)
{
table = resize(table, alg);
}
sort(wrd);
int code = alg(wrd);
code = code % table->num_buckets;
struct item* item_temp = malloc(sizeof(struct item));
struct item* item_add = malloc(sizeof(struct item));
item_add->wrd = wrd;
if (table->buckets[code]->head == 0)
{
table->buckets[code]->head = item_add;
table->occupied_buckets++;
}
else
{
item_temp = table->buckets[code]->head;
while (item_temp->next != 0) {
item_temp = item_temp->next;
}
item_temp->next = item_add;
}
table->buckets[code]->num_items++;
table->entries++;
if (table->buckets[code]->num_items > table->largest_bucket)
{
table->largest_bucket = table->buckets[code]->num_items;
}
}

编辑:崩溃的行是:

程序收到信号 SIGSEGV,段错误。0x0000000000400cbd 添加(表=0x613cc0,wrd=0x613ca0,alg=0x400942)在 ht.c:118118 如果(表->桶[代码]->头== 0)

请求的信息:

(gdb) 打印表->桶[799]$2 = (struct bucket *) 0x0

最佳答案

问题是在 resize 中你创建了一个全新的 HT 结构。但是在 add 中,您不会将其传递回调用链,因此在 main 中,您仍然有old HT结构。

作为额外的旁注,你永远不会释放任何东西,所以你有很多内存泄漏。


main 中,您创建了一个新表。让我们将此表称为 1。稍后当它变满时,您将创建一个 表,让我们将其称为 2。此新表由 resize 返回并用于 添加。但是当 add 返回时,main 函数仍然有一个指向表 1 的指针。

所以下次调用add时,main函数传递表1,表1太小,所以调用resize并创建另一个 表,3,仅在add 中本地使用。等等……

关于至少 375 次成功输入后出现代码段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15880967/

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