在struct上使用malloc的c

Use*_*172 0 c malloc free struct pointers

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

void image_init(struct image* img, int w, int h) {
    img = malloc(sizeof(struct image));
    (*img).w = w;
    (*img).h = h;
}
Run Code Online (Sandbox Code Playgroud)

并且再次释放图像的功能是:

void image_destroy(struct image* img) {
    free(img);
}
Run Code Online (Sandbox Code Playgroud)

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

图像结构是:

struct image {
    int w,h;
    int* data;
}
Run Code Online (Sandbox Code Playgroud)

我用以下函数调用函数:

struct image img;
image_init(&img,100,100);
image_destroy(&img);
Run Code Online (Sandbox Code Playgroud)

gio*_*gim 5

首先在这里

void image_init(struct image* img, int w, int h) {
    img = malloc(sizeof(struct image));
    (*img).w = w;
    (*img).h = h;
}
Run Code Online (Sandbox Code Playgroud)

img是传递给它的原始指针的副本,因此函数内第一行的代码没有效果,因为它使复制点在某处 - 而不是原始对象.

这个:

struct image img;
image_init(&img,100,100);
image_destroy(&img);
Run Code Online (Sandbox Code Playgroud)

也没有意义(假设你希望img在电话之后指向某个地方init).img不是指针,你怎么指望它指向某个地方?


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

struct image *img = image_init(100,100);
Run Code Online (Sandbox Code Playgroud)

哪里

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

不要忘记调用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;
}
Run Code Online (Sandbox Code Playgroud)

破坏:

void image_destroy(struct image* img) {
    free(img->data);
    free(img);
}
Run Code Online (Sandbox Code Playgroud)

主要的

struct image* img = malloc(sizeof(struct image));
image_init(img, 100, 100);
image_destroy(img);
Run Code Online (Sandbox Code Playgroud)

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