除此之外,您還
- 不與二維陣列和
- 和代碼泄漏內存處理,如果新的高度較小,則舊的高度和
- 你不需要在C中鑄造
void
-pointers和
- 全部
int
s應該是size_t
s
主要有兩個錯誤在這裏,因爲代碼
- 傳遞錯誤的大小重新分配外陣列。它將
height
乘以sizeof (char)
而不是sizeof (char*)
。
- 錯過了在通過內部調整大小循環將它們傳遞到
realloc()
之前,初始化附加指針realloc
用NULL
編輯到「外部」數組。
所以假設新的高度最低限度的調整是大於或等於舊的高度可能看起來像
void resize(size_t height, size_t height_current, size_t width, char **img){
int i;
img = (char**)realloc(img, sizeof(char*)*height);
for(i=height_current;i<height;i++){
img[i] = NULL;
}
for(i=0;i<width;i++){ // correct copypasta mistake here
img[i] = (char*)realloc(img[i], width);
}
}
一個更好的版本可能看起來像這樣
void resize(size_t height, size_t height_current, size_t width, size_t char **img)
{
if (height != height_current)
{
if (height < height_current)
{
for (size_t i = height; i < height_current; ++i)
{
free(img[i]);
}
}
img = realloc(img, height * sizeof *img);
if (height > height_current)
{
for (size_t i = height_current; i < height; ++i)
{
img[i] = NULL;
}
}
}
for (size_t i = 0; i < width; ++i)
{
img[i] = realloc(img[i], width * sizeof *img[i]);
}
}
這樣稱呼它:
resize(height*2, height, width*2, img);
還你真的想要添加錯誤檢查到malloc()
和realloc()
的所有調用,因爲它們可能會失敗!
來源
2017-10-09 07:30:50
alk
首先,我建議你做的一些研究*由C基準模擬通*。要繼續,重新分配後'img'的* new *元素會是什麼?提示:它們*未初始化*,不能按原樣傳遞給'realloc'。最後,在'realloc'失敗的情況下,您不應該回傳給您傳遞給'realloc'的指針。 –
這是**不是** 2d數組。邏輯是有缺陷的,首先是free()獨立數組,不再需要(如果有的話),然後調整指針數組的大小,然後分配新需要的單個數組並調整之前的大小。當然,檢查每個**'malloc()'/'realloc()'調用的錯誤。最後,修改局部變量會修改**副本**,您必須完成後返回'img'。 –
一般而言,「*但它不工作。*」是**不是**適合的問題描述。 –