在struct上使用malloc的c

时间:2016-05-18 19:47:37

标签: c pointers struct malloc free

我正在尝试在名为image的结构上使用malloc。功能是:

void image_destroy(struct image* img) {
    free(img);
}

再次释放图像的功能是:

struct image {
    int w,h;
    int* data;
}

但是每当我尝试释放malloc-ed数据时,我都会收到错误,即我试图释放的地址之前没有进行过malloc-ed。

图像的结构是:

struct image img;
image_init(&img,100,100);
image_destroy(&img);

我用以下函数调用函数:

            drawingContext.bindTexture(drawingContext.TEXTURE_2D, webGLTexture);

            drawingContext.texImage2D(drawingContext.TEXTURE_2D,
                                        0,
                                        drawingContext.RGBA,
                                        width,
                                        height,
                                        0,
                                        drawingContext.RGBA,
                                        drawingContext.UNSIGNED_BYTE,
                                        newData);

            drawingContext.activeTexture(drawingContext.TEXTURE0);
            drawingContext.uniform1i(webGLUTextureLoc, 0);

            // This will most likely be different for you.
            drawingContext.drawArrays(drawingContext.TRIANGLE_FAN, 0, 4);

4 个答案:

答案 0 :(得分:5)

首先在这里

void image_init(struct image* img, int w, int h) {
    img = malloc(sizeof(struct image));
    (*img).w = w;
    (*img).h = h;
}

img是传递给它的原始指针的副本,因此函数内第一行的代码无效,因为它使副本指向某处 - 而不是原始对象。

此:

struct image img;
image_init(&img,100,100);
image_destroy(&img);

也没有意义(假设您在调用img之后希望init指向某处。 img不是指针,你希望它指向何处?

你可以解决这个问题的一种方法是

struct image *img = image_init(100,100);

,其中

struct image* image_init(int w, int h) {
    img = malloc(sizeof(struct image));
    (*img).data = NULL;
    (*img).w = w;
    (*img).h = h;
    return img;
}

不要忘记在上面函数返回的指针上调用free - 你也需要单独释放data指针,以防你也分配它。

注意:我最好的猜测(如果你也无法改变原型)你想要这样的东西:

void image_init(struct image* img, int w, int h) {
    img->data = malloc(sizeof(int) * w * h);
    img->w = w;
    img->h = h;
}

破坏:

void image_destroy(struct image* img) {
    free(img->data);
    free(img);
}

主要

struct image* img = malloc(sizeof(struct image));
image_init(img, 100, 100);
image_destroy(img);

PS。或者,如果您希望使用这些功能,请继续使用Johnny Mopp的答案。

答案 1 :(得分:3)

我认为您的作业不是分配img而是分配data ptr:

void image_init(struct image* img, int w, int h) {
    img->data = malloc(sizeof(int) * w * h);// Check for failure...
    img->w = w;
    img->h = h;
}
void image_destroy(struct image* img) {
    free(img->data);
}

答案 2 :(得分:0)

cout << "Book count: ";  wscanf_s(L"%hi", &count);

在堆栈上分配图像结构。你为什么要尝试malloc?如果你真的想要一个在堆上,那么

for(var i=$scope.adminDataSource.length-1;i>=0;i--){
    var value = $scope.adminDataSource[i];
    if(value.id === 'RA_ATTST_LANGUAGE') {
       $scope.adminDataSource.splice(i,1);
    }
}

请注意更惯用的' - &gt;'使用

如果您想要堆栈中的那个,那么

struct image img;
image_init(&img,100,100);
image_destroy(&img);

答案 3 :(得分:-4)

您需要将malloc强制转换为struct,因为malloc的返回值是void类型。