C語言動態內存

malloc數組

  • 原型:void *malloc(size_t size)
    • size:請求內存的總字節數
    • 返回值:內存地址 NULL
#include<stdio.h>
#include<stdlib.h>
#define LEN 3

int main(void)
{
    //定義指向堆空間指針
    int* p = (int*)malloc(LEN*sizeof(int));
    if(NULL==p)
    {
        printf("內存申請失敗\n");
        return -1;
    }
    //類數組方式賦值
    for(int i=0;i<LEN;i++)
    {
        printf("輸入:");
        scanf("%d",p+i);
    }
    //遍歷
    for(int i=0;i<LEN;i++)
    {
        printf("%d\t",*(p+i));
    }
    //換行
    printf("\n");
    //釋放內存
    if(NULL!=p)
    {
        free(p);
        p = NULL;
    }
    return 0;
}

總結指針

  • malloc申請的內存在申請已後如同數組同樣暫時性不可變,同時申請的內存是連續內存因此能夠如數組同樣經過下標訪問到元素,同時用malloc申請的內存空間系統不會進行初始化操做,內部處於隨機狀態

calloccode

  • 原型:void *calloc(size_t nitems, size_t size)
    • nitems:個數
    • size:類型字節
    • 返回值:內存地址 NULL
#include<stdio.h>
#include<stdlib.h>

int main(void)
{
    printf("須要多個個?:");
    int n;//個數
    scanf("%d",&n);//用戶輸入個數
    int* p = (int*)calloc(n,sizeof(int));//申請對應個數的內存
    if(NULL==p)//申請失敗的問題
    {
        printf("內存申請失敗\n");
        return -1;
    }
    for(int i=0;i<n;i++)//循環輸入
    {
        printf("輸入:");
        scanf("%d",p+i);//相似數組
    }

    for(int i=0;i<n;i++)//循環輸出
    {
        printf("%d\t",*(p+i));
    }
    printf("\n");
    if(NULL!=p)//釋放空間
    {
        free(p);
        p=NULL;
    }
    return 0;
}

總結內存

calloc

  • calloc具備申請空間後自動初始化的能力,官方描述中也是如此,malloc是申請空間後不初始化,而傳參數方面,二者幾乎同樣,malloc參數總字節數,而calloc則分開成個數單個字節
  • 在元素訪問上看與數組無異

realloc原型

  • 原型:void *realloc(void *ptr, size_t size)
    • ptr:須要從新分配內存空間的目標地址
    • size:從新分配後的總大小
    • 返回值:內存地址 NULL
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main(void)
{
    char* str=(char*)calloc(8,sizeof(char));//申請堆區內存
    strcpy(str,"abcdefg");
    printf("從新分配以前第四位字符:%c\n",*(str+3));
    printf("從新分配以前:%d個佔位\n",(int)strlen(str));
     str = (char*)realloc(str,((int)sizeof(str)+2)*sizeof(char));
     printf("從新分配以後:%d個佔位\n",(int)strlen(str));
     if(NULL!=str)
     {
         free(str);
         str = NULL;
     }
    return 0;
}

out

總結string

  • realloc只能從新分配從malloc calloc申請到的內存空間,若是分配其它空間絕逼報錯不解釋,最易出錯的在於malloc是直接申請一塊內存,只須要傳入你的需求量,而且不會幫你初始化,而calloc一樣是直接申請一塊內存但會初始化,傳值是個數和單個類型的字節,而realloc是起到一個從新分配的做用,它的參數須要的是一個目標指針,和分配後這個目標指針的總大小,就比如原先的內存佔用是2個字節的,如今須要+3個字節,哪麼你的總需求量則是5個字節佔位,而不是3
相關文章
相關標籤/搜索