基本的 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
不应该硬编码,或者给它一个有价值的名字。
#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
不应该硬编码,或者给它一个有价值的名字。