malloc 在 struct 上的 C 用法

C usage of malloc on struct

我正在尝试在名为 image 的结构上使用 malloc。函数为:

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

再次释放图像的函数是:

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

但是每当我尝试释放 malloc-ed 数据时,我都会收到错误消息,指出我尝试释放的地址之前不是 malloc-ed。

图片结构为:

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

我用以下函数调用函数:

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

先到这里

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

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

这个:

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。或者,如果您希望这些功能的用法与 m​​ain 中的一样,请使用 Johnny Mopp 的答案。

您需要将 malloc 转换为结构,因为 return malloc 的值是 void 类型。

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

在您的堆栈上分配图像结构。你为什么要 malloc 一个?如果你真的想要一个在堆上然后做

    struct image * image_init( int w, int h) {
        struct image *img = malloc(sizeof(struct image));
        img->w = w;
        img->h = h;
        return img;
    }
...  
    struct image *img = image_init(100,100);

注意更惯用的“->”用法

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

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

我认为你的任务不是分配 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);
}