1. 程式人生 > >記憶體四區-棧區

記憶體四區-棧區

  區域性變數存放在棧區,函式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;
}