以下的C語言代碼:linux
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
-
- int main()
- {
- char *a, *b;
- int i;
-
- a = (char*) calloc(20, sizeof(char));
- b = (char*) calloc(20, sizeof(char));
-
- strcpy(a, "Graduate School of Information Science and Technology");
-
- for(i = 0; i < 20; i++)
- printf("b[%d] = %c\n", i, b[i]);
- return 0;
- }
已知:c++
b[11] = T
數組
那麼,b[12]、b[13]的值是多少?ide
在linux上建立一個文件t.c,輸入代碼,而後編譯、運行:spa
- [ggg@localhost ~]$ cd Desktop
- [ggg@localhost Desktop]$ ls
- gnome-terminal.desktop t.c t.c~
- [ggg@localhost Desktop]$ gcc -o t t.c
- [ggg@localhost Desktop]$ ./t
- b[0] = c
- b[1] = i
- b[2] = e
- b[3] = n
- b[4] = c
- b[5] = e
- b[6] =
- b[7] = a
- b[8] = n
- b[9] = d
- b[10] =
- b[11] = T
- b[12] = e
- b[13] = c
- b[14] = h
- b[15] = n
- b[16] = o
- b[17] = l
- b[18] = o
- b[19] = g
- [ggg@localhost Desktop]$
論壇會員qldsrx的解釋是:
實際上是和內存分配是否連續有關,若是兩次申請的內存是連續內存空間,那麼20字節再加上後面申請內存的頭部字節(預估是12字節),這樣下面一個申請的20字節正好偏移了32字節。
這個時候若是在return以前添加 free(b); 馬上程序崩潰,
由於b這個對象釋放時要查找b申請的大小,信息記錄在其內存的前面(預估是12個字節),但被改寫了。.net
另外,用visual c++ 6.0嘗試了一下,發現數組b中沒有任何值,這說明在內存分配上確實和linux平臺下的C編譯器有很大的差異。code