2013-09-19 5 views
2

Эта функция бросает нарушение доступа при чтении значений исходного пикселя, и я не могу понять, почему. Можно считать, что это единственная часть моего кода работает, я запустил это соло с тем же результатом.Доступ к местоположению обнаружения нарушения доступа 0x1D5C4C2F

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

ответ

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]; 
1

Когда вы выделяете блоки памяти в разных местах в памяти, fread на этой структуре не будет работать.

вместо этого выделяют один большой блок, а затем устанавливают указатели внутри блока, таким образом вы можете использовать его на нем.

+0

и если выделить один блок памяти не пытайтесь доступом к нему с несколько блоком индексов [I] [J] [K] – dmitri

Смежные вопросы