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)
首先在这里
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的答案.