文章目錄
- 1、全域區代碼分析
- 2、堆疊區代碼分析
- 3、堆區代碼分析
1、全域區代碼分析
全域區內部(global):
全域變數和靜態變數的存盤放在一起:
1、初始化的全域變數和靜態變數在一塊區域
2、未初始化的全域變數和未初始化的靜態變數在相鄰的另一個區域,
該區域在程式結束后由作業系統釋放
#include <stdio.h>
char* fun1()
{
char* p = "abcd";
return p;
}
char* fun2()
{
char* p = "abcd";
return p;
}
int main(void)
{
char* q = NULL;
char* s = NULL;
q = fun1();
s = fun2();
printf("%s %p\n",q,q);
printf("%s %p\n",s,s);
return 0;
}
執行結果:

代碼,很簡單,但是為什么能fun1、和fun2內部的指標回傳呢,畫個圖很清晰,fun1、fun2函式內的abcd屬于文字常量都是存盤在全域區,函式內部的指標只是指向這塊區的首地址,全域區的內容,函式結束之后不會銷毀,所以回傳給main 函式是可以使用的,因為兩個函式的文字常量都是abcd所以是同一個地址,
圖片為了方便看現象,他們不是,單獨的存在,

2、堆疊區代碼分析
由系統管理,釋放,存盤,函式內的區域變數,已經形參
#include <stdio.h>
char* fun1()
{
char p[] = "abcd";
return p;
}
char* fun2()
{
char p[] = "abcd";
return p;
}
int main(void)
{
char* q = NULL;
char* s = NULL;
q = fun1();
s = fun2();
printf("%s %p\n",q,q);
printf("%s %p\n",s,s);
return 0;
}
執行結果:

執行結果是亂碼
原因:將區域變數地址回傳,因為區域存盤在堆疊上,函式結束就會銷毀
abcd是存盤在全域區的
fun1、fun2函式只是將全域區的資料拷貝到了自己內部創建的陣列中,
只是值拷貝,所以說他們現在是沒關系的,現在將函式內部的區域變數
回傳是錯誤的,列印出來的值是未知的,因為函式結束之后,區域變數
就會銷毀
圖片為了方便看現象,他們不是,單獨的存在,

3、堆區代碼分析
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char* fun1()
{
char* p = (char*)malloc(20);
if(p==NULL)
return NULL;
strcpy(p,"abcd");
return p;
}
char* fun2()
{
char* p = (char*)malloc(20);
if(p==NULL)
return NULL;
strcpy(p,"abcd");
return p;
}
int main(void)
{
char* q = NULL;
char* s = NULL;
q = fun1();
s = fun2();
printf("%s %p\n",q,q);
printf("%s %p\n",s,s);
if(q!=NULL || s!=NULL)
{
free(q);
free(s);
q=NULL;
s=NULL;
}
return 0;
}

堆區記憶體需要自己釋放,不會隨著函式呼叫結束,釋放掉
圖片為了方便看現象,他們不是,單獨的存在,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/330316.html
標籤:其他
上一篇:[交換排序] 冒泡排序(兩種優化)、快速排序(3種方法+兩種優化)
下一篇:常見的幾種排序演算法
