下面兩段**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程式的儲存空間布...