我正在使用 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/