基本 C 内存分配 [重复]

问题描述 投票:0回答:3
#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;
}

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

c malloc
3个回答
1
投票

C 函数参数按值传递。这意味着当您将

ptr
传递给
allocateMem
时,您正在制作它的副本,然后当您在
allocateMem
内修改该副本时,您不会更改有关
ptr
的任何内容。

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

您希望函数在您调用的函数外部修改任何参数,您需要传递一个指针,因此如果您想修改指针,您需要传递一个指向指针的指针,如 @babon 所示在他们的答案中包含代码。


0
投票
修复方法如下:

#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()
返回的地址。当该函数返回时,
main()
发现
ptr
指向有效地址,并将数据写入分配的内存中。


0
投票
您可以将指针返回到分配的内存(并检查返回值),如下所示:

#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

 不应该被硬编码,或者给它一个有价值的名称。

© www.soinside.com 2019 - 2024. All rights reserved.