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。或者,如果您希望这些功能的用法与 main 中的一样,请使用 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);
}
我正在尝试在名为 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。或者,如果您希望这些功能的用法与 main 中的一样,请使用 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);
}