#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");
}
堆棧程序理解
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.