gpt4 book ai didi

c - 哈希表 valgrind 内存泄漏

转载 作者:行者123 更新时间:2023-11-30 16:55:31 24 4
gpt4 key购买 nike

您好,我一直在从事学校项目,需要您帮助编写代码。我使用 valgrind 来找出问题所在,并需要消除可怕的错误,您的想法到底意味着什么

函数将新元素插入表

这是我遇到的错误之一

Invalid write of size 1 at 0x4C29B32: strcpy (vg_replace_strmem.c:458) by 0x401CE9: HTab_insert (ial.c:65) by 0x4019B5: main (main.c:82) Address 0x5449785 is 0 bytes after a block of size 5 alloc'd at 0x4C28FA4: malloc (vg_replace_malloc.c:296) by 0x401CC9: HTab_insert (ial.c:64) by 0x4019B5: main (main.c:82)

HTab_listitem* HTab_insert(HTab_t* ptrht, Ttoken token) {
unsigned ind = hash_function(ptrht->htable_size,token);
HTab_listitem* item_ptr = NULL;
HTab_listitem* item = ptrht->list[ind];
HTab_listitem* nextitem;

if(item == NULL) {
nextitem = malloc(sizeof(HTab_listitem)+sizeof(char)*(strlen(token.data)+1));

if(nextitem == NULL)
/*allocation error*/
return NULL;
else {
//printf("HERE\n");
//printf("%s\n", token.data);
//memcpy(nextitem->token.data,token.data,strlen(token.data)+1);
int length = strlen(token.data);
nextitem->token.data = malloc(length * sizeof((char) +2));
strcpy(nextitem->token.data,token.data);
nextitem->token.data[length] = '\0';
nextitem->token.stav = token.stav;
//printf("HERE AFTER\n");
nextitem->ptrnext = NULL;

item = ptrht->list[ind] = nextitem;

nextitem = NULL;
if(item == NULL)
return NULL;
}
}
else {
while(item != NULL) {
if(strcmp(item->token.data,token.data) == 0) {
//if found
item_ptr = item;
break;
}
else {
//next item
item_ptr = item;
item = item->ptrnext;
}
}
if(item_ptr != NULL && item != item_ptr) {
//not found insert next item
nextitem = malloc(sizeof(HTab_listitem*)+sizeof(char)*(strlen(token.data)+1));
if(nextitem == NULL)
/*allocation error*/
return NULL;
else {
//memcpy(nextitem->token.data,token.data,strlen(token.data)+1);
int length = strlen(token.data);
nextitem->token.data = malloc(length * sizeof((char) +2));
strcpy(nextitem->token.data,token.data);
nextitem->token.data[length] = '\0';
nextitem->token.stav = token.stav;

nextitem->ptrnext = NULL;
item = nextitem;
if(item == NULL)
return NULL;
item_ptr->ptrnext = item;
}
}
}
return item;
}

最佳答案

您有一些分配错误,可能会导致未定义的行为。我将从上到下进入代码

首先,您分配了很多内存

nextitem = malloc(sizeof(HTab_listitem)+sizeof(char)*(strlen(token.data)+1));

以下内容应该足够了,因为 nextitem->token.data 是在之后分配的。

nextitem = malloc(sizeof(HTab_listitem));

此外,在分配 token.data 时,请使用以下内容:

int length = strlen(token.data);
nextitem->token.data = malloc( sizeof(char) * (length + 1) );
nextitem->token.data[length] = 0;

您的第二个项目分配的大小再次不正确。您分配了指针的大小(8 个字节)而不是结构的大小,并且添加 token 。数据仍然没有用。

nextitem = malloc(sizeof(HTab_listitem*)+sizeof(char)*(strlen(token.data)+1));
//Error here (HTab_listitem*)

应该是:

 nextitem = malloc(sizeof(HTab_listitem));

然后再次像之前一样分配 token.data。

关于c - 哈希表 valgrind 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40283261/

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