尝试读取固定大小的二进制文件时遇到问题。下面的代码在关闭文件之前返回细分错误。我想要实现的是将一个int指针返回给main函数。
该文件是原始灰度图像,其值从0到255,这就是为什么我使用unsigned char
的原因。
如何正确地将未签名的字符转换并分配给*int
?
欢迎任何帮助!
void readBinaryFile(char *filename, int *in){
FILE *file;
long length;
unsigned char *imagen;
int c;
file = fopen(filename, "rb");
fseek(file,0,SEEK_END);
length = ftell(file);
imagen = (unsigned char *) malloc(length);
fseek(file, 0, SEEK_SET);
fread(imagen, length, 1 , file);
int cont;
//c+4: file contains values from 0 to 255
for(c=0,cont=0;c<length;c=c+4,cont++){
in[cont] = (unsigned char) imagen[c];
}
for(cont=0;cont<length/4;cont++){
printf("%d",(int) in[cont]);
}
fclose(archivo);
free(imagen_buffer);
}
void main(int argc, char **argv){
int *in;
int fixed_size = 784;
in = (int *) malloc((fixed_size)*(fixed_size));
readBinaryFile("test.raw", in);
int c;
for(c=0;c<((fixed_size)*(fixed_size));c++){
printf("%d", (unsigned char) in[c]);
}
}
答案 0 :(得分:2)
此
int *in;
使in
指向int
。
此
in = (int *) malloc((fixed_size)*(fixed_size));
分配给in
784 * 784 = 614656字节。
int
s。 int
需要sizeof (int)
个字节,根据定义,从上面的1.和2.可以推断出784 * 784 int
需要更多,然后需要784 * 784字节。
所以改变
in = (int *) malloc((fixed_size)*(fixed_size));
成为
in = (int *) malloc((fixed_size)*(fixed_size) * sizeof (int));
甚至更好,更安全,噪音更少
in = malloc(fixed_size*fixed_size * sizeof *in);
因为
void*
(malloc()
返回)。fixed_size
周围的括号没用。sizeof *in
返回与sizeof (int)
相同,但是如果您将int * in
更改为unsigned * in
,则会“存活”。另外,在阅读时,您需要确保不要阅读超过784 * 784 char
,否则分配给int
的内存将被溢出,从而调用臭名昭著的Undefined Behaviour。