C語言strcpy函數所引起的問題

以下的C語言代碼:linux

 

[cpp]  view plain  copy
 
 print ? 在CODE上查看代碼片 派生到個人代碼片
  1. #include <stdio.h>   
  2. #include <stdlib.h>   
  3. #include <string.h>   
  4.   
  5. int main()  
  6. {  
  7.   char *a, *b;   
  8.   int i;   
  9.   
  10.   a = (char*) calloc(20, sizeof(char));   
  11.   b = (char*) calloc(20, sizeof(char));   
  12.   
  13.   strcpy(a, "Graduate School of Information Science and Technology");   
  14.   
  15.   for(i = 0; i < 20; i++)   
  16.      printf("b[%d] = %c\n", i, b[i]);   
  17.   return 0;   
  18. }  


已知:c++

 

b[11] = T
數組

那麼,b[12]、b[13]的值是多少?ide


在linux上建立一個文件t.c,輸入代碼,而後編譯、運行:spa

 

[plain]  view plain  copy
 
 print ? 在CODE上查看代碼片 派生到個人代碼片
  1. [ggg@localhost ~]$ cd Desktop  
  2. [ggg@localhost Desktop]$ ls  
  3. gnome-terminal.desktop  t.c  t.c~  
  4. [ggg@localhost Desktop]$ gcc -o t t.c  
  5. [ggg@localhost Desktop]$ ./t  
  6. b[0] = c  
  7. b[1] = i  
  8. b[2] = e  
  9. b[3] = n  
  10. b[4] = c  
  11. b[5] = e  
  12. b[6] =    
  13. b[7] = a  
  14. b[8] = n  
  15. b[9] = d  
  16. b[10] =    
  17. b[11] = T  
  18. b[12] = e  
  19. b[13] = c  
  20. b[14] = h  
  21. b[15] = n  
  22. b[16] = o  
  23. b[17] = l  
  24. b[18] = o  
  25. b[19] = g  
  26. [ggg@localhost Desktop]$   


論壇會員qldsrx的解釋是:
實際上是和內存分配是否連續有關,若是兩次申請的內存是連續內存空間,那麼20字節再加上後面申請內存的頭部字節(預估是12字節),這樣下面一個申請的20字節正好偏移了32字節



這個時候若是在return以前添加 free(b); 馬上程序崩潰,
由於b這個對象釋放時要查找b申請的大小,信息記錄在其內存的前面(預估是12個字節),但被改寫了。
.net

 

另外,用visual c++ 6.0嘗試了一下,發現數組b中沒有任何值,這說明在內存分配上確實和linux平臺下的C編譯器有很大的差異。code

相關文章
相關標籤/搜索