記憶體四區-棧區
區域性變數存放在棧區,函式return以後申請的這塊棧區就被回收(C++編譯器把這段記憶體析構了),所以在函式內宣告的區域性變數,函式外不能使用該區域性變數的記憶體地址。下面用程式碼說明:
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
char *getMem()
{
char buf[32]; //因為buf是臨時變數,是放在棧區存放
strcpy(buf, "I love u");
return buf;
}
int main()
{
char *tmp = NULL;
tmp = getMem(); //getMem函式return以後,buf陣列佔用的32位元組的棧區已經被析構了,tmp接收到的只是這段記憶體的記憶體地址,可能是亂碼,可能是任何東西
printf("%s \n", tmp);
system("pause");
return 0;
}
用DevC++執行報錯:function returns address of local variable (函式返回區域性變數的地址)
用VS2017 Debug專案:
不知道指向了哪塊記憶體
用VS2017 Release專案:
可以正常顯示
看到用VS2017 Release雖然可以正常顯示,但是這樣寫程式碼明顯是不可以的。
如果getMem函式不是返回地址,而是返回char型別變數的話可以,如下:
char getMem()
{
char buf[32]; //因為buf是臨時變數,是放在棧區存放
strcpy(buf, "I love u");
return buf[0];
}
int main()
{
char tmp = getMem(); //getMem函式return以後,會用buf[0]的值 I 放到tmp的記憶體地址(棧區)
printf("%c \n", tmp);
system("pause");
return 0;
}