gpt4 book ai didi

c - 侵入式数据结构示例中的堆损坏

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

这是一个双向链表,节点/链接携带存储在列表中所需的信息(侵入式):

dlist.h:

#ifndef DLIST_H
#define DLIST_H

//--------------------------------------------------------------------------

typedef struct Link
{
struct Link* succ;
struct Link* prev;
} Link;

//--------------------------------------------------------------------------

typedef struct List
{
Link* first;
Link* last;
} List;

//--------------------------------------------------------------------------

void init(List* lst)
{
assert(lst);

lst->first = 0;
lst->last = 0;
}

//--------------------------------------------------------------------------

List* create()
{
List* lst = (List*) malloc(sizeof(List*));

init(lst);

return lst;
}

//--------------------------------------------------------------------------

void push_back(List* lst, Link* l)
{
assert(l);
assert(lst);
{
Link* last = lst->last;

if (last)
{
last->succ = l;
l->prev = last;
}
else
{
lst->first = l;
l->prev = 0;
}

lst->last = l;
l->succ = 0;
}
}

//--------------------------------------------------------------------------

void clear (List* lst)
{
assert(lst);
{
Link* curr = lst->first;
Link* next = 0;

while (curr)
{
next = curr->succ;

free(curr);

curr = next;
}

lst->first = 0;
lst->last = 0;
}
}

//--------------------------------------------------------------------------

void destroy (List* lst)
{
assert(lst);

clear(lst);

free(lst);
}

//--------------------------------------------------------------------------

typedef struct Name
{
Link l;
char* s;
} Name;

//--------------------------------------------------------------------------

Name* make_name(char* str)
{
Name* n = (Name*) malloc(sizeof(Name*));
n->s = str;

return n;
}

//--------------------------------------------------------------------------

#endif

main.c:

#include <stdlib.h>     // malloc
#include <stdio.h> // printf
#include <assert.h> // assert


#ifdef __cplusplus


#else // compiling in C.

int main ()
{
List* lst = create();

char* names[ ] = { "Giorikas", "Kostikas", "Foo", "Bar", "Gosho", "Pesho" };
char* name;

int i = 0;
int size = 6;

for (i; i < size; ++i)
{
push_back(lst, (Link*)(make_name(names[i])));

name = ((Name*)(lst->last))->s;
printf("Name: %s \n", name);
}

destroy(lst);

getchar();

return 0;
}

#endif

使用调试器步进时,我打印了名称,并且在函数 clear() 中,在第一次尝试释放链接时,我收到了两个警告,最后:

_CrtIsValidHeapPointer(pUserData)

注意:经过一些研究,我了解到:“您不会在重写发生时立即收到堆损坏,而是在下一次堆检查时收到,这将在任何下一次内存分配/解除分配。”。因此,clear() 中发生的可能是触发错误的堆检查。

堆损坏发生在哪里?

最佳答案

你做出了错误的分配。你需要分配对象而不是指针,所以:

List* lst = (List*) malloc(sizeof(List*));

应该是

List* lst = (List*) malloc(sizeof(List));

至少 Name 也是如此。您还可以删除强制转换:

List* lst = malloc(sizeof(List));

-----编辑----

更好的成语是:

List* lst = malloc(sizeof(*lst));

关于c - 侵入式数据结构示例中的堆损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44495046/

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