Привет!
У меня есть простая программа на qt на c.
Существует два указателя для ввода short, которые используются для чтения из файла и сохранения битов из прочитанных значений.
пример кода:
//(input is a FILE* which is opened and passed to the function)
//(output is also a FILE* which is also opened and passed to the function)
//1. Variables declaration
short* sample_buffer;
int buffer_size=1;
short samples_read;
unsigned long value_x=7;
short* nzb_buffer;
short buffer_position=-1;
int i;
//2.Memory allocation
sample_buffer= malloc(sizeof(short)*buffer_size);
nzb_buffer = malloc(sizeof(short)*value_x);
....
//3. Read from infile, one short at time, process and write it to outfile
do
{
//3.1. Read from input file
samples_read = fread(sample_buffer,sizeof(short),buffer_size, input);
//3.2. Switch position inside nzb_buffer one to the right,
// going back to zero if out of bounds
buffer_position=(buffer_position+1)%value_x;
....
//3.3. Put least significant bit of the just read short into nzb_buffer
nzb_buffer[buffer_position]=sample_buffer[0]%2;
....
//3.4. Write the short we just read from infile to the outfile
for (i=0;i<samples_read;i++)
{
fwrite(sample_buffer,sizeof(short),1, output);
}
} while(samples_read==buffer_size);
Я выпустил нерелевантные фрагменты кода. Если вам нужно увидеть что-то еще, пожалуйста, скажите мне.
Проблема в том, что после примерно 10 или 15 операций цикла происходит сбой с сигналом "Ошибка сегментации". Сбой в функции fwrite ().
Я отладил, и я использую часы на sample_buffer. По какой-то причине на одном точном шаге операция nzb_buffer [buffer_position] = sample_buffer [0]% 2 делает sample_buffer равным 0x0 (я верю, он становится нулевым указателем).
Это не может быть переполнено в nzb_buffer, потому что buffer_position для этой операции равно 3 (из 7, выделенных для конкретного массива в malloc). И поскольку каждый цикл выполняет одну операцию записи и переносит перенос, операция записи в nzb_buffer [3] уже выполнялась ранее в цикле и не обнуляла указатель в этот раз.
Я совершенно не понимаю, что здесь может происходить.
У кого-нибудь есть идеи, что происходит или как отладить это?
Заранее спасибо!
PS: добавлены комментарии "что делает код"