C語言 函式堆記憶體分配問題剖析

2021-08-07 07:44:07 字數 2533 閱讀 2253

下面兩段**test1和test2,test1是對陣列進行了初始化,而test2沒有定義長度:

#include #include void test1();

void test2();

void main()

void test1()

printf("*****************************\n");

while (s[i] !='\0')

printf("s2 = %s,length = %d\n", s2,strlen(s2));

}void test2()

printf("*****************************\n");

while (s[i] !='\0')

printf("s2 = %s,length = %d\n", s2,strlen(s2));

}

然而,test1和test2的執行結果和想象的完全不一樣(test1是進行了陣列的初始化,而test2沒有)test1的結果是:

s2[0] = w,length = 7

s2[1] = g,length = 7

s2[2] = w,length = 7

s2[3] = e,length = 7

s2[4] = 1,length = 7

s2[5] = 2,length = 7

s2[6] = 3,length = 7

**************************

s[0] = w,length = 7

s[1] = g,length = 7

s[2] = w,length = 7

s[3] = e,length = 7

s[4] = 1,length = 7

s[5] = 2,length = 7

s[6] = 3,length = 7

s2 = wgwe123,length = 7

test2的結果是:

s2[0] = w,length = 7

s2[1] = g,length = 7

s2[2] = w,length = 7

s2[3] = e,length = 7

s2[4] = 1,length = 7

s2[5] = 2,length = 7

s2[6] = 3,length = 7

************************

s[0] = g,length = 6

s[1] = w,length = 6

s[2] = e,length = 6

s[3] = 1,length = 6

s[4] = 2,length = 6

s[5] = 3,length = 6

s2 = wgwe123,length = 7

顯然test1的結果是正確的,test2的結果是錯誤的,是因為s2陣列初始化沒有設定長度(當然這本身就是不對的)

問題是:輸出的結果:s2也成功被複製了,s 的內容卻發生了變化,為什麼初始陣列會發生變化呢再來:

void test3()

printf("*****************************\n");

while (s[i] !='\0')

printf("s2 = %s,length = %d\n", s2,strlen(s2));

}

結果是:

s2[0] = w,length = 7

s2[1] = g,length = 7

s2[2] = w,length = 7

s2[3] = e,length = 7

s2[4] = 1,length = 7

s2[5] = 2,length = 7

s2[6] = 3,length = 7

************************

s[0] = 1,length = 3

s[1] = 2,length = 3

s[2] = 3,length = 3

s2 = wgwe123,length = 7

s2被賦值成功了,s變成了123,檢視strcpy的原始碼:

char * strcpy(char *dst,const char *src)  

原始碼是沒問題的,那就考慮記憶體占用問題了,實際上,如果沒有對s2進行初始化,那麼s2系統只給他分配了乙個位元組的空間儲存陣列的\0,那麼對s2進行拷貝的時候,很有可能會把s的記憶體空間占用,而如果s2開始就分配了記憶體的話這種情況是不存在的。列印記憶體如下:

C 語言動態堆記憶體分配

一 記憶體可以分為棧 堆 靜態儲存區 常量儲存區。二 malloc 分配記憶體 include include includeint main 將malloc分配的記憶體初始化為0 memset p,0,sizeof int void memset void p,int c,int n 對分配的記憶...

c語言 記憶體分配問題

記憶體分配問題 記憶體分配方式有三種 1 從靜態儲存區域分配。內存在程式編譯的時候就已經分配好,這塊內存在程式的整個執行期間都存在。例如全域性變數,static 變數。2 在棧上建立。在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束時這些儲存單元自動被釋放。棧記憶體分配運算內置...

C語言中記憶體分配問題

推薦 c語言中記憶體分配 linux size命令和c程式的儲存空間布局 本大神感覺,上面的鏈結的內容,已經很好的說明了 對於乙個可執行檔案,在linux下可以使用 size命令列出目標檔案各部分佔的位元組數 分為 text段 data段與bss段 參考 linux size命令和c程式的儲存空間布...