Указатель становится ничем без видимой причины - PullRequest
1 голос
/ 13 января 2011

Привет!

У меня есть простая программа на 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: добавлены комментарии "что делает код"

1 Ответ

1 голос
/ 13 января 2011

Ваше условие выхода для цикла, кажется, неуместно.Я бы сделал:

samples_read = fread(sample_buffer,sizeof(short),buffer_size, input);
while(samples_read==buffer_size){

    [...]        

    samples_read = fread(sample_buffer,sizeof(short),buffer_size, input);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...