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

标签 c

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

相关文章:

c - `memcpy((void *)dest, src, n)` 和 `volatile` 数组安全吗?

c - C中动态分配数组的大小

使用 getc() 和 putc() 在 C 中复制文件文本 - 输出文件中的二进制代码

c - 为什么 gcc 失败并显示 'unrecognized command line option "-L/lusr/opt/mpfr-2.4.2/lib"'?

c - 如何在 MacRuby 中创建 C 指针?

无法在内联汇编中声明 .data

c - 理解 libm 中日志操作中的数字文字

c - 为什么 fgets 不能从 popen 流中获取所有字节

C:逻辑运算符

c - 验证二进制数组是否是 C 中另一个二进制数组的子集