C語言幾個申請地址空間的函數

1、void * malloc(unsigned int size)

malloc爲動態內存分配,申請一塊連續指定大小的內存塊區域以void*類型返回分配的內存區域地址;

  1. 函數頭文件:#include<stdlib.h>
  2. 申請得到的爲連續的存儲空間,如果分配失敗,則返回一個空指針(NULL)
  3. 返回的指針類型:void*(未確定類型的指針),也爲空間首地址
  4. 函數參數爲指定的字節數
  5. 最後用free()函數釋放內存(free釋放內存問題)
  6. malloc(0)屬於合法語句,它能返回一個合法的指針(有一說法是,當malloc分配內存時它除了分配我們指定SIZE的內存塊,還會分配額外的內存來存儲我們的內存塊信息,用於維護該內存塊)
#include<stdio.h>
#include<stdlib.h>

void main()
{
	char *p;
	p = (char*)malloc(100*sizeof(char));    //sizeof獲取字節數
	if(p==NULL)exit(-1);                    //如果分配空間失敗,0爲正常退出,其他爲非正常退出
	printf("輸入一串字符:");
	scanf("%s",p);
	printf("\n輸出:%s\n",p);
	free(p);
	p = NULL;
}

2、void *realloc(void *ptr, size_t size);

指針名=(數據類型*)realloc(要改變內存大小的指針名,新的大小),首先判斷ptr指向的區域是否有足夠的空間,如果有,則增大(或減少)該內存區域,然後將ptr返回;如果ptr指向的區域沒有足夠的空間,則分配一段新的內存區域,並且將原ptr的數據拷貝到新的內存區域,釋放ptr指向的內存區域(內部完成,不需要外部使用free),同時返回新分配的內存區域的首地址。即重新分配存儲器塊的地址

  1. 函數頭文件:#include<stdlib.h>
  2. 改變的區域可以比舊內存區域大或小
  3. 如果分配失敗,則返回空指針NULL(此時ptr所指的舊內存區域並沒有被釋放,需要用free函數釋放這一部分內存,因此不能直接賦值給ptr,這樣將導致ptr指針變爲空指針,使舊內存區域無法得到釋放 )
char* Dilatation(char* p,int n)
{
	char* q;
	q = (char*)realloc(p,n*sizeof(char));
	if(!q)
	{
		free(p);                            //如果返回爲空指針,則釋放原來的舊地址內存
	}
	return q;
}

3、void* calloc(unsigned int num,unsigned int size)

在內存的動態存儲區中分配num個長度爲size的連續空間;
注意:num:對象個數,size:對象佔據的內存字節數,相較於malloc函數,calloc函數會自動將內存初始化爲0

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

 
int main()
{
    char*str = NULL;
    str = (char*)calloc(10,sizeof(char));
    printf("String is %s\n",str);
	free(str);
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章