C在struct上使用malloc
我试图在名为image的结构上使用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数据
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代码执行的规则。它们是不同的语言,这是一个有着重要区别的地方。