我一直在使用Java和相当新的C.我试图创建一个函数,生成一个随机像素数组与malloc。在使用该随机数组后,我在另一个函数中释放内存。我认为我的概念很好,但我想知道如果我写的代码正确,它真的释放堆内存。如果你能看看代码,看看它是否有效,那就太好了。
pixel* randomPalette(int colors){
int i, x;
pixel * randomArr = (pixel *)malloc(sizeof(pixel)* colors);
srand(time(NULL)); //generate a random seed
for (i = 0; i < colors; i++){
x = rand() % 256;
randomArr[i].r = x; randomArr[i].g = x; randomArr[i].b = x;
}
return randomArr;
}
void QuantizeA(pixel* Im, int width, int height){
//create a random palette of 8 RGB colors;
const int num = 8;
pixel* Arr = randomPalette(num);
//find the min distance between pixel and palette color
int x, y, z;
int min = 195075; // max distance is 255^2 + 255^2 + 255^2
int pos = 0;
for (x = 0; x < height; x++){
for (y = 0; y < width; y++){
//compare distance of the pixel to each palette color
for (z = 0; z < num; z++) {
if (distance(Im[pos], Arr[z]) < min){
Im[pos].r = Arr[pos].r;
Im[pos].g = Arr[pos].g;
Im[pos].b = Arr[pos].b;
}
}
pos++; //go to next piexl
}
}
glutPostRedisplay();
free(Arr);
}
从内存分配-释放部分来看,您的代码是好的(我没有检查您的逻辑)。但是,这里需要注意两件事,
- 使用返回值前检查
malloc()
是否成功。 - 你只需要在程序开始时调用
srand(time(NULL));
一次,可能在main()
中。
作为一个建议,如果您怀疑有任何内存泄漏相关问题,您可以始终使用valgrind的memcheck工具来检查内存泄漏相关问题。
另外,请参阅关于为什么不在C
中转换malloc()
和family的返回值的讨论。
当您指定新的最小距离时:
Im[pos].r = Arr[pos].r;
使用了错误的索引。应该是:
Im[pos].r = Arr[z].r;
作为旁注:您不能使用比较操作符比较两个结构体,即使是相等的,但C允许您将一个结构体赋值给另一个结构体,这有效地复制了内容。所以你不需要复制所有的组件,你只需要输入:
Im[pos] = Arr[z];