除此之外,您还
- 不与二维阵列和
- 和代码泄漏内存处理,如果新的高度较小,则旧的高度和
- 你不需要在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'。 –
一般而言,“*但它不工作。*”是**不是**适合的问题描述。 –