gpt4 book ai didi

c - 动态内存只能在函数调用内部访问

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

我正在使用 malloc() 创建动态内存,它在创建它的函数中工作,但在该函数结束后它不再工作。我试图做到这一点,即使在函数内创建的动态内存结束后,也可以访问在函数内创建的动态内存。

typedef struct ListObj
{
int data;
struct ListObj* next;
struct ListObj* prev;
} ListObj;

typedef struct List
{
struct ListObj* front;
struct ListObj* back;
struct ListObj* cursor;
} List;

List newList(void)
{
List* pL = malloc(sizeof(List));

if (pL == NULL)
{
fprintf(stderr, "malloc failed\n");
exit(EXIT_FAILURE);
}

pL->front = pL->back = pL->cursor = NULL;

return *pL;
}

ListObj newListObj(void)
{
ListObj* pLO = malloc(sizeof(ListObj));

if (pLO == NULL)
{
fprintf(stderr, "malloc failed\n");
exit(EXIT_FAILURE);
}

pLO->next = pLO->prev = NULL;

return *pLO;
}

int length(List L)
{
L.cursor = L.front;
int n = 0;

while (L.cursor != NULL)
{
n++;
L.cursor = L.cursor->next;
}

return n;
}

void append(List L, int data)
{
ListObj LO = newListObj();
LO.data = data;

if (L.back != NULL)
{
LO.prev = L.back;
L.back->next = &LO;
}

L.back = &LO;
if (L.front == NULL)
{
L.front = &LO;
}

if (L.front == NULL)
{
printf("append null\n");
}
}

List L = newList();

for (i = 0; i < 5; i++)
{
if (length(L) == 0)
{
append(L, i);
}
}

length(L) 一直返回 0,每次调用 append() 时它应该增加 1。

最佳答案

考虑使用这些小改进:

原型(prototype):

List newList(void);

应该改为:

List  *newList(void);

那么该函数调用中的返回语句应该是:

return pL; //(remove *)

这个建议对于其他尝试类似用法的函数也是一样的,例如:ListObj newListObj(void)

在调用函数中使用完后不要忘记释放这 block 内存。

以下基本上是您的代码没有其他改进除了添加main()函数通过一个示例调用,关于使用指针的建议,以及使用指针的后续副作用。例如,结构指针符号、释放等:(它构建并运行,但我不确定这些改进是否会解决代码可能存在的其他问题。)

List * newList(void)
{
List* pL = malloc(sizeof(List));

if (pL == NULL)
{
fprintf(stderr, "malloc failed\n");
exit(EXIT_FAILURE);
}

pL->front = pL->back = pL->cursor = NULL;

return pL;
}

ListObj * newListObj(void)
{
ListObj* pLO = malloc(sizeof(ListObj));

if (pLO == NULL)
{
fprintf(stderr, "malloc failed\n");
exit(EXIT_FAILURE);
}

pLO->next = pLO->prev = NULL;

return pLO;
}

int length(List *L)
{
L->cursor = L->front;
int n = 0;

while (L->cursor != NULL)
{
n++;
L->cursor = L->cursor->next;
}

return n;
}

void append(List *L, int data)
{
ListObj *LO = newListObj();
LO->data = data;

if (L->back != NULL)
{
LO->prev = L->back;
L->back->next = LO;
}

L->back = LO;
if (L->front == NULL)
{
L->front = LO;
}

if (L->front == NULL)
{
printf("append null\n");
}
}

int main(void)
{
List *L = newList();
for (int i = 0; i < 5; i++)
{
if (length(L) == 0)
{
append(L, i);
}
}
free(L);
return 0;
}

关于c - 动态内存只能在函数调用内部访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58205742/

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