Исключение записи данных в новый файл

Моя задача — прочитать файл yuv, и к каждому его компоненту (Y, Cb, Cr) я добавляю некоторые данные и сохраняю их в другом файле. Я попробовал следующий код:

#include <stdio.h>
#include <stdlib.h>

void main()
{
FILE *fp=fopen("traffic_1920x1080.yuv","rb");
FILE *myYUV=fopen("traffic_1920x1088.yuv","ab");
int count=0;
unsigned char *y=(unsigned char*)malloc(sizeof(unsigned char)*1920*1080);
unsigned char *u=(unsigned char*)malloc(sizeof(unsigned char)*(1920/2)*(1080/2));
unsigned char *v=(unsigned char*)malloc(sizeof(unsigned char)*(1920/2)*(1080/2));

unsigned char ypad[1920*8];
unsigned char upad[(1920/2)*4];
unsigned char vpad[(1920/2)*4];

for(int i=0;i<(1920/2)*4;i++)
{
ypad[i]=255;
upad[i]=128;
vpad[i]=128;
}
for(int i=(1920/2)*4;i<1920*8;i++)
ypad[i]=255;
while (!feof(fp))
{
fread(y,sizeof(unsigned char),1920*1080,fp);
fread(u,sizeof(unsigned char),1920/2*1080/2,fp);
fread(v,sizeof(unsigned char),1920/2*1080/2,fp);

fwrite(y, sizeof(unsigned char),1920*1080,myYUV);
fwrite(ypad,sizeof(unsigned char),1920*8,myYUV);

fwrite(u,sizeof(unsigned char),1920/2*1080/2,myYUV);
fwrite(upad,sizeof(unsigned char),1920/2*4,myYUV);

fwrite(v,sizeof(unsigned char),1920/2*1080/2,myYUV);
fwrite(vpad,sizeof(unsigned char),1920/2*4,myYUV);

printf("Frame %d created\r",count);
y+=1920*1080;
u+=1920/2*1080/2;
v+=1920/2*1080/2;
count ++;
}
free(y);
free(u);
free(v);

fclose(fp);
fclose(myYUV);
}

Однако приведенный выше код прекрасно работает для первого цикла, но во втором цикле я получаю исключение

Access violation writing location 0x0092f000.

на линии fwrite(y, sizeof(unsigned char),1920*1080,myYUV);

Это проблема приращения указателя? или это что то другое? Ответьте, пожалуйста. Заранее спасибо.

0

Решение

Эти приращения:

y+=1920*1080;
u+=1920/2*1080/2;
v+=1920/2*1080/2;

будет увеличивать указатели после конца выделенной памяти. Например, y указывает на начало 1920 * 1080 байт выделенной памяти. Увеличение его на столько сильно указывает на конец этого воспоминания. Это приводит к чтению / записи в / из нераспределенной памяти. Вот почему вы получаете нарушение доступа.

На самом деле я не вижу причины для увеличения этих указателей вообще.

Кроме этого, ваш код должен проверять наличие ошибок (успешно ли fopen () и т. Д.)

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]