ошибка сегментации при записи в файл - PullRequest
0 голосов
/ 14 февраля 2019

При записи в файл возникает ошибка сегментации, код ниже

Я открываю файл в двоичном режиме.У меня есть memcpy много структур в массив, а затем записываю данные в файл (названный sample.avi)

ofstream AVI;
AVI.open("sample.avi",ios::binary);

if(!AVI)
{
   cout << "AVI file not opening"<<endl;
   return 0;
}

long long int size = 0;
size = sizeof(List) + sizeof(List) + sizeof(AVIMainHeader) + sizeof(List) + sizeof(AVIStreamHeader) + sizeof(BitmapInfoHeader) + sizeof(BitmapInfoHeader) + sizeof(List);
 cout << size;
uint8_t *AVIFile = new uint8_t[300];

List riff = MakeRiffHeader();
List hdrl = MakeHdrlHeader();
AVIMainHeader avih = MakeAvihHeader();
List strl = MakeStrlHeader();
AVIStreamHeader strh = MakeStrhHeader();
BitmapInfoHeader bit = MakeBitHeader();
List movi = MakeMoviHeader();

long long int length1 = 0;

memcpy(&AVIFile[length1], (const void*)&riff, sizeof(List));
length1 += sizeof(List);

memcpy(&AVIFile[length1], (const void*)&hdrl, sizeof(List));
length1 += sizeof(List);

memcpy(&AVIFile[length1], (const void*)&avih, sizeof(AVIMainHeader));
length1 += sizeof(AVIMainHeader);

memcpy(&AVIFile[length1], (const void*)&strl, sizeof(List));
length1 += sizeof(List);

memcpy(&AVIFile[length1], (const void*)&strh, sizeof(AVIStreamHeader));
length1 += sizeof(AVIStreamHeader);

memcpy(&AVIFile[length1], (const void*)&bit, sizeof(BitmapInfoHeader));
length1 += sizeof(BitmapInfoHeader);

memcpy(&AVIFile[length1], (const void*)&movi, sizeof(List));
length1 += sizeof(List);

AVI.write(reinterpret_cast<char*>(AVIFile),length1);

Chunk vidf;
vidf.Ckid = MakeFourCC("00db");
vidf.CkSize = 2048 * 1537;

AVI.write(reinterpret_cast<char*>(&vidf), sizeof(vidf));
AVI.write(reinterpret_cast<char*>(red), 2048 * 1537);

AVI.close();
return 0;

Строка, откуда у меня начинаются writing(AVI.write(reinterpret_cast<char*>(AVIFILE), length1)) и строки ниже, кажется источником для сегментациивина (как будто мы это комментируем, она не дает ошибки).

пожалуйста, укажите, где я не прав

РЕДАКТИРОВАТЬ:

uint8_t *BUFFER = new uint8_t[length];                   
uint8_t *BUFFER1 = new uint8_t[(3 * length) / 2];
uint8_t *final_image = new uint8_t[(3 * length) / 2];
uint8_t *red = new uint8_t[2048 * 1546];            
uint8_t *green1 = new uint8_t[2048 * 1546];         
uint8_t *green2 = new uint8_t[2048 * 1546];         
uint8_t *blue = new uint8_t[2048 * 1546];           

1 Ответ

0 голосов
/ 14 февраля 2019
AVI.write(reinterpret_cast<char*>(&red), 2048 * 1537); 

должно быть

AVI.write(reinterpret_cast<char*>(red), 2048 * 1537); 

Если у вас есть указатель, вам не нужно добавлять &, чтобы получить адрес, на который вы указываете, вы просто используете сам указатель.

...