【问题标题】:Access violation reading location location 0x1D5C4C2F访问冲突读取位置位置 0x1D5C4C2F
【发布时间】:2013-09-19 23:28:17
【问题描述】:

这个函数在读取原始像素值时会引发访问冲突,我不知道为什么。 可以将其视为我的代码运行的唯一部分,我已经单独运行了相同的结果。

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);
}

【问题讨论】:

    标签: c memory rgb


    【解决方案1】:

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

    如果您希望 images 成为一组离散的内存块,请像这样分配:

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

    请注意,sizeof(unsigned char) 被标准定义为始终为 1。您无需一直乘以 sizeof(unsigned char)

    现在,要获得图像中的像素地址,您需要乘以(通常是行优先):

    unsigned char * pixel = images[i] + (y * width + x) * bpp;
    unsigned char r = pixel[0];
    unsigned char g = pixel[1];
    unsigned char b = pixel[2];
    

    【讨论】:

      【解决方案2】:

      当您在内存中的不同位置分配内存块时,对该结构的 fread 将不起作用。

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

      【讨论】:

      • 如果你分配一块内存,不要尝试使用多个下标 block[i][j][k]
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-31
      • 2016-05-28
      • 2017-01-09
      • 2014-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多