Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
访问冲突读取位置0x1D5C42F_C_Memory_Rgb - Fatal编程技术网

访问冲突读取位置0x1D5C42F

访问冲突读取位置0x1D5C42F,c,memory,rgb,C,Memory,Rgb,这个函数在读取原始像素值时抛出访问冲突,我不知道为什么。 可以把这看作是我的代码运行的唯一部分,我用相同的结果运行这个独奏。< /P> string filenames[]={"firstclick.raw", "secondclick.raw","thirdclick.raw","fourthclick.raw","fifthclick.raw","sixthclick.raw","seventhclick.raw","eighthclick.raw"}; FILE *file; int he

这个函数在读取原始像素值时抛出访问冲突,我不知道为什么。 可以把这看作是我的代码运行的唯一部分,我用相同的结果运行这个独奏。< /P>
string filenames[]={"firstclick.raw", "secondclick.raw","thirdclick.raw","fourthclick.raw","fifthclick.raw","sixthclick.raw","seventhclick.raw","eighthclick.raw"};
FILE *file;
int height= 750, width = 453, bbp=3;

unsigned char ****images;
images = (unsigned char ****)malloc(sizeof(unsigned char ***)*8);
for(int j = 0; j<8; j++){
    images[j] = (unsigned char ***)malloc(sizeof(unsigned char**)*height);
    for(int i = 0; i<height; i++){
        images[j][i]= (unsigned char **)malloc(sizeof(unsigned char*)*width);
        for(int k = 0; k<bbp; k++)
            images[j][i][k]= (unsigned char *)malloc(sizeof(unsigned char)*bbp);
    }
}

for (int i = 0; i<8; i++){
    if (!(file=fopen(filenames[i].c_str(),"rb"))){
        cout << "Cannot open file: "<<filenames[i].c_str() <<endl;
        exit(1);
    }
    fread(images[i], sizeof(unsigned char), height*width*bbp, file);
    fclose(file);
}
string文件名[]={“firstclick.raw”、“secondclick.raw”、“thirdclick.raw”、“fourthclick.raw”、“fifthclick.raw”、“sixthclick.raw”、“seventhclick.raw”、“eighthclick.raw”};
文件*文件;
内部高度=750,宽度=453,bbp=3;
无符号字符****图像;
图像=(无符号字符****)malloc(sizeof(无符号字符***)*8);

对于(int j=0;j当您在内存中的不同位置分配内存块时,该结构上的fread将不起作用


相反,分配一个大的块,然后将指针设置为指向块内部,这样您就可以在块上使用fread。

这里的问题是,您已经将数组的每个元素分配为一个单独的数组(内存中的其他地方,其位置作为指针保留).但当您读入时,您假定它是一个连续的块。您将覆盖所有这些指针,并使缓冲区溢出以启动

如果希望
图像
成为一组离散的内存块,请按如下方式分配:

unsigned char ** images;
int i;

images = malloc( sizeof(unsigned char *) * 8 );
for( i = 0; i < 8; i++ ) {
    images[i] = malloc( width * height * bpp );
}

如果您分配了一块内存,请不要尝试使用多个下标块[i][j][k]访问它
unsigned char * pixel = images[i] + (y * width + x) * bpp;
unsigned char r = pixel[0];
unsigned char g = pixel[1];
unsigned char b = pixel[2];