堆棧程序理解

#include "stdio.h"
#include "stdlib.h"
#include "string.h"

//堆
char *getMem(int num)
{
    char *p1= NULL;
    p1 = (char *)malloc(sizeof(char)*num);  //用戶分配內存空間,由操作系統管理,函數結束後不會被析構掉
    if( NULL== p1)
    {
        return NULL;
    }
    return p1;
}

//棧   局部變量不能把其內存地址作爲函數返回值返回
//注意:此處 return 不是把內存塊64個字節return出來,而是把內存塊的首地址(內存標號,比如0xaa11)返回給主函數中的tmp
//理解指針的關鍵是 內存,沒有內存哪來的指針。
char *getMem2()
{
    char buf[64];  //臨時變量,系統自動分配內存空間,函數結束後將會被析構掉
    strcpy(buf,"123456");
    printf("buf:%s\n",buf);
    //return buf;   //注意:函數執行完,buf[]數組的內存塊即被析構掉了,
                    //若將該內存塊的首地址buf返回給主函數,其對應的內容是未知的,程序可能崩潰
}

void main()
{
    char *tmp = NULL;
    tmp = getMem(10);

    if( NULL==tmp )
    {
        return ;
    }
    strcpy(tmp,"233333"); //向tmp所指向的內存空間中copy數據
    printf("tmp:%s.\n",tmp);
    free(tmp);
    tmp=getMem2();
    printf("tmp:%s.\n",tmp);   //release下可以輸出字符串“123456”,但是debug下亂碼
    system("pause");
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章