#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 函数参数按值传递。这意味着当您将
ptr
传递给 allocateMem
时,您正在制作它的副本,然后当您在 allocateMem
内修改该副本时,您不会更改有关 ptr
的任何内容。
您正在造成内存泄漏,因为您无法释放动态分配的内存,因为您没有保留指向它的指针。
您希望函数在您调用的函数外部修改任何参数,您需要传递一个指针,因此如果您想修改指针,您需要传递一个指向指针的指针,如 @babon 所示在他们的答案中包含代码。
#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
指向有效地址,并将数据写入分配的内存中。
#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
不应该被硬编码,或者给它一个有价值的名称。