学数据结构一开始就会遇到这样的语句
int *a = (int*)malloc(n*sizeof(int));
但仅仅知道而不理解是不可行的,还要明白动态分配用法。
适用情况:
- 数组的长度必须事先指定,而且只能是常量,不能是变量。
- 比如像下面这么写就是对的:
int a[5];
- 而像下面这么写就是错的:
int length = 5;
int a[length]; //错误
- 因为数组长度只能是常量,所以它的长度不能在函数运行的过程当中动态地扩充和缩小。
一,malloc函数的使用
方式一:
int *p = (int *)malloc(8);
方式二:(推荐用这种方式,可移植性高)
int *p = malloc(sizeof(int));
//或者
int *a = (int*)malloc(n*sizeof(int)); //这里的n后的*表示乘法,不是指针
这个例子就是请求系统分配 8 字节的内存空间,并返回第一字节的地址,然后赋给指针变量 p。当用 malloc 分配动态内存之后,上面这个指针变量 p 就被初始化了。
malloc函数的原型:
# include <stdlib.h>
void *malloc(unsigned long size);
其中void和void*的区别:
- void* 是定义一个无类型的指针变量
- void 是无返回值
# include <stdio.h>
# include <stdlib.h> //malloc()的头文件
void Mul(int *i); //函数声明
int main(void)
{
int *p = malloc(4);
*p = 2;
Mul(p); //注意是传p,不是*p
printf("*p = %d\n", *p);
return 0;
}
void Mul(int *i)
{
*i = (*i) * 10;
return;
}
解释:
指针变量 p 中的地址被传递给指针变量 i (注意是传p,不是*p)
此时 i 和 p 指向的是同一个内存单元,指向单元的值为2
所以操作 i 所指向的内存空间就是操作 p 所指向的内存空间。
下面这是一个无限申请空间分配的程序,每次请求申请1024字节空间,会导致电脑内存泄漏从而死机。
# include <stdio.h>
# include <stdlib.h> //malloc()的头文件
int main(void)
{
while (1)
{
int *p = malloc(1024);
}
return 0;
}
二,free函数的使用
动态分配的内存空间是由程序员手动编程释放的!
free函数用法:
//假设定义了指针p
free(p)
free 函数的原型是:
# include <stdlib.h>
void free(void *p);
注意:
- free 函数无返回值,它的功能是释放指针变量 p 所指向的内存单元。
- 释放并不是指清空内存空间,而是指将该内存空间标记为“可用”状态
- 指针变量 p 被释放之后,它仍然是指向那块内存空间的,但那块内存空间已经不再属于它,该内存空间可能会被分配给其他变量使用。
- 释放空间后,相应空间内的值不一定准确,不同编译器结果不同
举例:
# include <stdio.h>
# include <stdlib.h>
int main(void)
{
int *p = malloc(sizeof*p);
*p = 20;
printf("p = %p\n", p);
free(p);
printf("p = %p\n", p);
return 0;
}
***