當我喜歡運行代碼如下:解放出來動態2D陣列未按預期用C
#include <stdio.h>
#include <stdlib.h>
int main (void)
{
int i, count = 0x09;
int sizei = 5, sizej = 2;
int **ary = malloc (sizei * sizeof **ary);
for (i = 0; i < sizei; i++) {
*(ary + i) = malloc (sizej * sizeof *(ary + i));
**(ary + i) = ++count;
printf (" %2d |%p| +%x+ \n", i, (ary + i), *(*(ary + i)));
}
puts("----");
for (i = sizei - 1; i >= 0; i--) {
printf (" %2d |%p| +%x+ \n", i, (ary + i), *(*(ary + i)));
free (*(ary + i));
}
puts("----");
free (ary);
return 0;
}
我期望的是,第一半將產生整數稱爲ary
的2D動態陣列(即一個指針一個動態分配的指針數組,每個指向一個動態分配的ints數組)。每個陣列**(ary + i)
的第0個元素將被遞歸地分配的count
當前值。
下半部分將反向迭代,釋放每個元素ary
,反過來它是malloc'd,然後釋放ary
本身。
這似乎做工精細,直到我嘗試釋放*(ary + 0)
,在這一點上,我得到一個雙免費/損壞錯誤。我已經包含了輸出。
0 |0x1d6f010| +a+
1 |0x1d6f018| +b+
2 |0x1d6f020| +c+
3 |0x1d6f028| +d+
4 |0x1d6f030| +e+
----
4 |0x1d6f030| +e+
3 |0x1d6f028| +d+
2 |0x1d6f020| +c+
1 |0x1d6f018| +b+
0 |0x1d6f010| +1d6f0b0+
*** Error in `./a.out': double free or corruption (out): 0x0000000001d6f030 ***
我很好奇爲什麼ary
第0個元素的0號元素(即*(*(ary + 0) + 0))
或只是**ary
)成爲什麼樣子一些內存地址(僅適用於性能稍微)出從什麼就由這個二維數組邊界一旦它退出第一個循環。
如果我擺脫了第二循環的,只是嘗試直接免費ary
沒有首先釋放的任何元素,我得到的是這樣的:
0 |0x1d6f010| +a+
1 |0x1d6f018| +b+
2 |0x1d6f020| +c+
3 |0x1d6f028| +d+
4 |0x1d6f030| +e+
----
*** Error in `./a.out': free(): invalid next size (fast): 0x0000000001d6f010 ***
我不明白我做了什麼錯這裏。使用數組符號會有所作爲嗎?我需要的任何解決方案,讓我有如果在所有可能的的ary
其餘元件的長度的每個陣列獨立的的動態長度。的ary
的數量的元件將不necesarily在編譯時是已知的。如果這是相關的,我使用gcc 4.9。