基本的 C 内存分配

Basic C Memory Allocation

#include <stdio.h>
#include <stdlib.h>

void allocateMem(int *a)
{
    a = (int*)malloc(5 * sizeof(int));
}

int main()
{
    int *ptr;
    allocateMem(ptr);
    ptr[0] = 5454;
    ptr[1] = 54;
    printf("Hi %d\n", ptr[1]);
    free(ptr);
    return 0;
}

我没有得到任何输出和代码错误。但是如果我在 main 函数中分配内存,它实际上可以工作。

修复方法如下:

#include <stdio.h>
#include <stdlib.h>

void allocateMem(int **a)
{
    *a = malloc(5 * sizeof(int));
}

int main()
{
    int *ptr;
    allocateMem(&ptr);
    ptr[0] = 5454;
    ptr[1] = 54;
    printf("Hi %d\n", ptr[1]);
    free(ptr);
    return 0;
}

要写入另一个函数中的变量,您需要传递一个指向它的指针。由于此处的目的是写入指针,因此需要传递指针的地址 - &ptr.

随着地址的传递,allocateMem() 函数取消引用 a 一次以跳转到要更新的内存位置并放置 malloc() 返回的地址。当此函数 returns、main() 发现 ptr 指向有效地址并在分配的内存中写入数据。

C 函数参数按值传递。这意味着当您将 ptr 传递给 allocateMem 然后在 allocateMem 内修改它时,您不会更改任何关于 ptr.

的内容

正在造成内存泄漏,因为你无法释放你动态分配的内存,因为你没有保留指向它的指针。

任何你想要一个函数在你调用的函数外部修改的参数,你需要传递一个指针,所以如果你想修改一个指针,你需要传递一个指向指针的指针,因为@babon 已经用他们的答案中的代码进行了演示。

您可以 return 指向已分配内存的指针(并检查 return 值),如下所示:

#include <stdio.h>
#include <stdlib.h>

int *allocateMem(void)
{
    return (int*)malloc(5 * sizeof(int));
}

int main()
{
    int *ptr;
    if( NULL != (ptr = allocateMem()))
    {
        ptr[0] = 5454;
        ptr[1] = 54;
        printf("Hi %d\n", ptr[1]);
        free(ptr);
    }
    return 0;
}

allocateMem中的常数5不应该硬编码,或者给它一个有价值的名字。