C在struct上使用malloc

C在struct上使用malloc,c,pointers,struct,malloc,free,C,Pointers,Struct,Malloc,Free,我试图在名为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数据

我试图在名为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
是传递给它的原始指针的副本,因此函数中第一行的代码无效,因为它使复制点位于某个位置,而不是原始对象

这:

也没有意义(假设您希望
img
在调用
init
之后指向某个地方)
img
不是指针,你希望它指向什么地方


解决这个问题的一个方法是

struct image *img = image_init(100,100);
在哪里

不要忘记对上述函数返回的指针调用
free
——您还需要单独释放
数据
指针,以防您也分配它


注意:我的最佳猜测(如果您也无法更改原型)是您想要这样的东西:

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);
或者,如果你想让这些函数的使用保持原样,请先回答Johnny Mopp。

void image_init(struct image* img, int w, int h) {
    img = malloc(sizeof(struct image));
    (*img).w = w;
    (*img).h = h;
}
img
是传递给它的原始指针的副本,因此函数中第一行的代码无效,因为它使复制点位于某个位置,而不是原始对象

这:

也没有意义(假设您希望
img
在调用
init
之后指向某个地方)
img
不是指针,你希望它指向什么地方


解决这个问题的一个方法是

struct image *img = image_init(100,100);
在哪里

不要忘记对上述函数返回的指针调用
free
——您还需要单独释放
数据
指针,以防您也分配它


注意:我的最佳猜测(如果您也无法更改原型)是您想要这样的东西:

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);

或者,如果您希望这些函数的使用保持与main中相同,请使用Johnny Mopp的答案。

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

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

struct image img;
image_init(&img,100,100);
image_destroy(&img);
在堆栈上分配映像结构。你为什么要找一个?如果你真的想在堆上放一个,那就做吧

    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;
}
在堆栈上分配映像结构。你为什么要找一个?如果你真的想在堆上放一个,那就做吧

    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
,而是分配
数据
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);
}

我认为您的任务不是分配
img
,而是分配
数据
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);
}


您是否检查了
malloc()
返回的内容?让我们用一个字母的结构成员名称保存击键,然后在
(*img).w
上浪费两个字符,而不是
img->w
!太棒了。您检查了
malloc()
返回的内容了吗?让我们用一个字母的结构成员名称保存击键,然后在
(*img).w
上浪费两个字符,而不是
img->w
!太好了,谢谢。但是image_init的调用和它的原型是给我们实现的,所以我认为我们不能改变它。有没有不改变它的解决方案?或者,您可以保持结构与原始结构相似,但将
struct image**img
作为参数传递,并使用
malloc
ed指针指定
*img
。@user3745172在这种情况下,您不需要
malloc
。应该为函数提供已分配的结构指针。正如你在问题中所做的那样。只需删除
malloc
行,您就完成了。@user3745172在这种情况下,您可能需要使用指针指向指针。请参考谷歌,检查如何使用指向指针的指针初始化结构。@user3745172如果无法更改原型,请参阅更新谢谢。但是image_init的调用和它的原型是给我们实现的,所以我认为我们不能改变它。有没有不改变它的解决方案?或者,您可以保持结构与原始结构相似,但将
struct image**img
作为参数传递,并使用
malloc
ed指针指定
*img
。@user3745172在这种情况下,您不需要
malloc
。应该为函数提供已分配的结构指针。正如你在问题中所做的那样。只需删除
malloc
行,您就完成了。@user3745172在这种情况下,您可能需要使用指针指向指针。请参考谷歌,请检查如何使用指针指针初始化一个结构。@ USER 375 5172见更新,如果你不能改变原型,这是完全正确的。这是一个完美的感觉。谨防应用C++编译器强制执行的规则到C代码。它们是不同的语言,这是一个有着至关重要的区别的地方。注意C++编译器对C代码执行的规则。它们是不同的语言,这是一个有着重要区别的地方。