C语言基础知识——malloc

1、
malloc : 在堆上分配空间
void *mall (size_t size);
参数:要分配的空间大小,单位是字节
返回值: 如果分配成功指向分配的空间
如果分配失败,返回NULL

free :释放堆上的空间
void free(void *ptr);
参数:指向要释放的空间的指针

2、
int *pa = (int *)malloc((sizeof(int)/ sizeof(char));

malloc()函数 ——在栈上分配空间,malloce函数申请得到的空间是无类型的空间,必须强制转换成对应指针可以指向的空间的类型
sizeof()函数 ——单目运算,求出对应类型所占用的字节数
(类型名) ——单目运算,为强制类型转换

int *pa; //定义一个指向整型的指针变量
pa = (int *)malloc((sizeof(int)/ sizeof(char));
//建立(动态申请)一块内存空间,长度 = sizeof(int)/ sizeof(char)。
//并把建立的空间地址转化为指向整型的指针赋值给前面的整型指针变量pa。
//如果这块动态内存不释放,相当于把一个整型变量的地址给前面的指针。

(int*)malloc(sizeof(int)) ——将申请得到的空间地址,先转换成int类型空间地址,再赋值给指向int型空间的pa指针

**3、**程序举例——简单的空间分配

#include <stdio.h>
#include <stdlib.h>

int main1()
{
	int *pa = (int *)malloc(sizeof(int)/ sizeof(char));
	
	if (NULL == pa)
	{
		printf ("空间分配失败\n");
	}
	
	printf ("释放前:%p\n", pa);//以十六进制整数形式(前加0x)输出指针的值
	
	free(pa);//释放空间
	
	printf ("释放后:%p\n", pa);
	
	pa = NULL;
	free(pa);//若无pa = NULL,则不得在此又一次进行空间的释放(free(pa))
	
	return 0;
}

**4、**程序举例——分配二维数组 int a[3][4]

#include <stdio.h>
#include <stdlib.h>

int main()
{
	//分配连续的空间
	int (*pa)[4] = (int(*)[4])malloc(sizeof(int)/sizeof(char)*3*4);
	//例如:int (*p)[4] = a;
	//括号中的*表明 p 是一个指针,它指向一个数组,
	//数组的类型为int[4],这正是 a 所包含的每个一维数组的类型。
	
	if (NULL == pa)
	{
		printf ("空间分配失败\n ");
	}
	
	pa[1][2] = 10;
	
	printf ("pa[1][2] = %d\n", pa[1][2]);
	
	free(pa);
	
	return 0;
}

**5、**程序举例——分配二维数组 int a[3][4]的另一种方式

int main()
{
	int **pa = (int **)malloc(sizeof(int *)/sizeof(char)*3);
/*
	例如:
	int a =100;//int类型的变量a
	int *p1 = &a;//p1是指向a的指针变量
	int **p2 = &p1;//p2又是指向p1的指针变量
	
	(int *)malloc(sizeof(int *)/sizeof(char)*3)
	即将申请得到的空间地址,存放到p1中,再将p1的地址存放到pa中
*/

	if (NULL == pa)
	{
		printf ("空间分配失败\n ");
	}
	
	int i;
	
	for (i = 0; i < 3; i++)//为三个一维数组分别申请空间	
	{
		pa[i] = (int *)malloc(sizeof(int)/sizeof(char)*4); 	//即为包含四个元素的一维数组申请空间
		
		if (NULL == pa)
		{
			printf ("空间分配失败\n ");
		}
	}
	
	for (i = 0; i < 3; i++) //先释放pa指向的三个一维数组指向的空间
	{
		free(pa[i]);
	}
	free(pa);//再释放pa指向的空间
	
	return 0;
}

猜你喜欢

转载自blog.csdn.net/ypjsdtd/article/details/84666113
今日推荐