原文发布于Hibiki33’s Blog,转载请标明出处。
在C99标准之前,假如我们有一个变量 n
,以 int nums[n];
的方式声明数组是非法的。为了向下兼容,我们需要引入动态内存分配,灵活地调整程序运行时所占空间。
malloc
是我们使用最多的动态内存函数。函数原型为:
extern void *malloc (unsigned int num_bytes)
其作用为申请一块连续的内存,并返回一个指向这块内存开头的指针。所需头文件为 <stdlib.h>
例如我现在需要接受一个浮点数数组的输入,我们会提前输入相应的浮点数个数,那么我们可以通过以下程序段实现:
int n;
scanf("%d", &n);
float *nums = (float *)malloc(sizeof(float) * n);
for (int i = 0; i < n; i++)
{
scanf("%f", nums + i);
}
这段代码的意思是,当我们知道数组的大小后,我们声明一个名为 nums
的浮点型指针,然后我们用 malloc
函数申请一块大小为 n
个 float
的区域(并将返回的指针经行强制类型转换),最后将 nums
指向这个区域。然后我们就可以调用这个 nums
数组了。
malloc()
在堆上分配内存,而 free()
负责释放内存。当通过 malloc
申请的内存已经不需要再使用时我们用 free
将这块内存释放。原型为:
void free (void *ptr)
参数中的 ptr
指向需要释放的内存。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char *str;
/* 最初的内存分配 */
str = (char *) malloc(15);
strcpy(str, "runoob");
printf("String = %s, Address = %p\n", str, str);
/* 释放已分配的内存 */
free(str);
return(0);
}
下面是一道涉及动态内存分配的例题,读者可以运用 malloc
进行解答(一般做题时不用 free
进行释放也无妨,但是在正式场合 malloc
和 free
一定成对出现)。
-
给定一个非负整数
n
,生成「杨辉三角」的前n
行。 -
示例:
输入: n = 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]
参考答案:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n;
scanf("%d", &n);
/* 为杨辉三角的申请相应的内存空间 */
int **ans = (int **) malloc(sizeof(int*) * n);
for (int i = 0; i < n; i++)
{
ans[i] = (int *)malloc(sizeof(int) * (i + 1));
ans[i][0] = ans[i][i] = 1;
for (int j = 1; j < i; j++)
{
ans[i][j] = ans[i - 1][j] + ans[i - 1][j - 1];
}
}
/* 打印结果 */
for (int i = 0; i < n; i++)
{
for (int j = 0; j <= i; j++)
{
printf("%d ", ans[i][j]);
}
printf("\n");
}
/* 释放内存 */
for (int i = 0; i < n; i++)
{
free(ans[i]);
}
free(ans);
return 0;
}