C语言中的动态内存分配

简介

全局变量是分配在内存中的静态存储区的,非静态的局部变量是分配在内存中的动态存储区的,这个存储区是一个称为栈(stack)的区域。

除此以外,C语言还允许建立内存动态分配区域,以存放一些临时用的数据,这些数据不必在程序的声明部分定义,也不必等到函数结束时才释放,而是需要时随时开辟,不需要时随时释放。这些数据是临时存放在一个特别的自由存储区,称为堆(heap)区。由于未在声明部分定义它们为变量或数组,因此不能通过变量名或数组名去引用这些数据,只能通过指针来引用。

动态分配内存

C语言中,对内存的动态分配,主要是通过malloc、calloc、free和realloc这四个函数实现。

1.malloc函数

函数原型为

1
void * malloc(unsigned int size);

作用:在内存的动态存储区中分配一个长度为size的连续空间。

函数的返回值是所分配区域的第一个字节的地址。指针的基类型为void,即不能指向任何类型的数据,只提供一个地址。如果函数未能成功地执行,则返回空指针(NULL)。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
#include <stdlib.h>
int main() {
extern void check(int * p);//函数声明
int * p = (int *)malloc(5*sizeof(int));//开辟动态内存区,并将地址转换为int * 型
for(int i = 0; i < 5;i++) {
scanf("%d",p+i);
}
check(p);
return 0;
}
extern void check(int * p) {
printf("fail\n");
for(int i = 0 ; i < 5;i++ ) {
if(p[i] < 60) printf("%d",p[i]);
}
}

事实上,第5行中的代码也可以写成如下形式:

1
int * p = malloc(5*sizeof(int));//由系统进行隐式的类型转换

推荐采用第一种写法,显式的强制转换,更加清楚直观。

另外,因为在不同系统中存放一个指定类型的字节数是不同的,为了使程序具有通用性,我在第5行中使用了sizeof运算符测定在本系统中整数的字节数。

(未完待续)


----------本文结束感谢您的阅读----------
坚持原创技术分享,您的支持将鼓励我继续创作!