我正在尝试在名为image的结构上使用malloc。功能是:
void image_destroy(struct image* img) {
free(img);
}
再次释放图像的功能是:
struct image {
int w,h;
int* data;
}
但是每当我尝试释放malloc-ed数据时,我都会收到错误,即我试图释放的地址之前没有进行过malloc-ed。
图像的结构是:
struct image img;
image_init(&img,100,100);
image_destroy(&img);
我用以下函数调用函数:
drawingContext.bindTexture(drawingContext.TEXTURE_2D, webGLTexture);
drawingContext.texImage2D(drawingContext.TEXTURE_2D,
0,
drawingContext.RGBA,
width,
height,
0,
drawingContext.RGBA,
drawingContext.UNSIGNED_BYTE,
newData);
drawingContext.activeTexture(drawingContext.TEXTURE0);
drawingContext.uniform1i(webGLUTextureLoc, 0);
// This will most likely be different for you.
drawingContext.drawArrays(drawingContext.TRIANGLE_FAN, 0, 4);
答案 0 :(得分:5)
首先在这里
void image_init(struct image* img, int w, int h) {
img = malloc(sizeof(struct image));
(*img).w = w;
(*img).h = h;
}
img
是传递给它的原始指针的副本,因此函数内第一行的代码无效,因为它使副本指向某处 - 而不是原始对象。
此:
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。或者,如果您希望使用这些功能,请继续使用Johnny Mopp的答案。
答案 1 :(得分:3)
我认为您的作业不是分配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);
}
答案 2 :(得分:0)
cout << "Book count: "; wscanf_s(L"%hi", &count);
在堆栈上分配图像结构。你为什么要尝试malloc?如果你真的想要一个在堆上,那么
for(var i=$scope.adminDataSource.length-1;i>=0;i--){
var value = $scope.adminDataSource[i];
if(value.id === 'RA_ATTST_LANGUAGE') {
$scope.adminDataSource.splice(i,1);
}
}
请注意更惯用的' - &gt;'使用
如果您想要堆栈中的那个,那么
struct image img;
image_init(&img,100,100);
image_destroy(&img);
答案 3 :(得分:-4)
您需要将malloc强制转换为struct,因为malloc的返回值是void类型。