1. 程式人生 > >C語言基礎知識——malloc

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;
}