将unsigned char解析为int指针后出现段错误

时间:2018-09-23 09:42:49

标签: c dynamic-memory-allocation

尝试读取固定大小的二进制文件时遇到问题。下面的代码在关闭文件之前返回细分错误。我想要实现的是将一个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]);
    }           
}

1 个答案:

答案 0 :(得分:2)

int *in;

使in指向int

 in = (int *) malloc((fixed_size)*(fixed_size));

分配给in 784 * 784 = 614656字节。

  1. 您需要784 * 784 int s。
  2. int需要sizeof (int)个字节,根据定义,可能很好,并且通常 更大 然后是1。

从上面的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);

因为

  • 在C语言中,无需强制转换void*malloc()返回)。
  • fixed_size周围的括号没用。
  • 使用sizeof *in返回与sizeof (int)相同,但是如果您将int * in更改为unsigned * in,则会“存活”。

另外,在阅读时,您需要确保不要阅读超过784 * 784 char,否则分配给int的内存将被溢出,从而调用臭名昭著的Undefined Behaviour。