【发布时间】:2022-01-11 02:28:15
【问题描述】:
我知道这个问题已经被问过几次了,但是没有一个对我有用。我有一个带有 2 个 int 变量和一个 unsigned char 指针的结构,我正在创建一个指向该结构的指针。然后我想修改 2 个 int 变量的值,并使用 fread() 获取一个 .raw 文件(位于资源文件文件夹中,也许它需要在其他地方?)并将其放入 unsigned char 指针中。但是 fread() 总是返回 0,当我尝试在结构指针上使用 free() 时程序崩溃。到目前为止,这是我的代码:
结构:
typedef unsigned char UCHAR;
struct IMAGERAW
{
int height;
int width;
UCHAR* image;
};
typedef struct IMAGERAW IMAGE;
主要:
int main()
{
IMAGE *img;
img = read_image();
free(img->image);
free(img);
}
read_image():
IMAGE *read_image()
{
IMAGE* img;
FILE* fpI;
int height = 1409;
int width = 1690;
int freadReturn;
fpI = fopen("file.raw", "rb");
img = (IMAGE*)malloc(sizeof(IMAGE));
img->height = height;
img->width= width;
freadReturn = fread(img->image, sizeof(UCHAR), img->height * img->width, fpI);
printf("fread() returns : %d", freadReturn);
fclose(fpI);
return img;
}
freadReturn 变量总是设置为 0(我认为应该设置为 height * width),并且程序在“free(img->image);”行给出了错误。尺寸是正确的,如果我更改它们,程序会更早崩溃,文件名也是如此,所以我真的不知道我做错了什么。提前致谢!
【问题讨论】:
-
img->image只是一个指针。我看不到您为它应该指向的字节分配空间。 -
@BoP 是的,我刚刚意识到......不知道我是怎么错过的。
-
read_image() 也返回一个本地指针。此变量现在超出范围,因此您不应使用 main() 中的值
-
fpI = fopen("file.raw", "rb");文件在没有路径的情况下打开,因此系统将尝试在“当前目录”中找到它,无论是什么。众所周知,某些 IDE 会将其移动到各处。不保证它是可执行文件的目录,所以在使用它之前测试返回值是个好主意。 -
@jmq read_image() 返回恰好是通过 malloc() 获得的指针的局部变量的 VALUE。这还不错。