malloc()和free()c

时间:2015-09-27 19:31:27

标签: c arrays pointers malloc free

我一直在使用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);
}

2 个答案:

答案 0 :(得分:1)

从内存分配 - 释放部分,你的代码很好(我没有检查你的逻辑)。但是,这里要注意两件事,

  1. 在使用返回值之前检查malloc()是否成功。
  2. 您只需在计划开始时拨打srand(time(NULL));一次,可能在main()
  3. 作为建议,您可以随时使用valgrind中的 memcheck 工具来检查与内存泄漏相关的问题,如果您怀疑的话。

    另外,请参阅why not to cast the return value of malloc() and family in C.上的讨论。

答案 1 :(得分:1)

分配新的最小距离时:

Im[pos].r = Arr[pos].r;

你使用错误的索引。它应该是:

Im[pos].r = Arr[z].r;

作为旁注:您不能将两个结构与比较运算符进行比较,即使是相等也不能,但C允许您将一个结构分配给另一个结构,这有效地复制了内容。所以你不需要复制所有组件,你可以说:

Im[pos] = Arr[z];