нужна помощь с ошибкой сегментации в коде c - PullRequest
0 голосов
/ 18 ноября 2010

я держу данные в буфере,

struct buf *bufPtr = malloc((sizeof(struct buf))*(MAX_FILE_SIZE));

Затем я хочу записать буфер в файл размером (sizeof(struct buf))*(MAX_FILE_SIZE) код ниже позволит мне открыть новый файл, заполнить его содержимым буфера, закрыть файл и освободить буфер

#define MAX_SIZE_PER_FILE 0x4000000
FILE *fp;
struct buf *bufPtr = malloc((sizeof(struct buf))*(MAX_FILE_SIZE));

k1[0]=0x0000;

k1[1]=0x0000;

while(k1[0] != 0xffff)

{

    while(k1[1] != 0xffff)

    {
                //something different happens in the below line, but has noting to do with segmentation errors
                bufPtr[i].a[1] = k[1]
                //occurs on all variables of the struct

                if( write_count + sizeof(struct buf) >= sizeof(struct buf)*MAX_FILE_SIZE ) {

                     write_count = 0;

                     sprintf( filename, "keys%d", file_idx );

                     file_idx++;

                     fp = fopen(filename, "wb");
                     printf("test1");
                     fwrite(bufPtr, sizeof(struct buf)*(MAX_FILE_SIZE),1,fp);
                     fclose(fp);
                     free(bufPtr);

                  }
                write_count += sizeof(struct buf);
                k1[1]++;

                counter++;

     }
     write_count += sizeof(struct buf);

     k1[1]++;

     i++;

}

Я получаю ошибку сегментации в определенной точке этого кода, и я знаю, что max_file_size будет больше, поскольку struct buf состоит из двух шортов

struct buf{

    unsigned short a[2];

     unsigned short b[2];

};

любые идеи для меня, ребята

Я получил эту ошибку при запуске моего Mac

Program received signal:  “EXC_BAD_ACCESS”.
sharedlibrary apply-load-rules all
(gdb) 

это было значение в структуре

bufPtr[counter].a[0] = a1[0];

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

Ответы [ 6 ]

2 голосов
/ 18 ноября 2010

Три вещи, которые не должны ничего менять, но значительно облегчат нам (и вам) ваш код для понимания и исправления.

  • НИКОГДА не имеют одинаковых имен для переменных и типов (bufпротив buf), и желательно избегать идентификаторов, которые отличаются только по типу.Распространенной идиомой является использование заглавных букв.(Buf против buf)
  • Отформатируйте и сделайте отступ в своем коде красиво
  • Используйте typedef struct для определения структуры

Вот пример:

typedef struct
{
  unsigned short a[2];
  unsigned short b[2];
} Buffer;

Buffer *buf = malloc(sizeof(Buffer) * MAX_FILE_SIZE);

Что касается того, что является причиной ошибки, сказать сложно.Я хотел бы видеть #define для MAX_FILE_SIZE и больше контекста, где происходит сбой.Теперь ваш malloc выглядит хорошо, но вы не проверяете, удастся ли вам ...

1 голос
/ 18 ноября 2010

Вместо этого используйте sizeof (struct buf).

1 голос
/ 18 ноября 2010
  • Вы никогда не проверяете возвращаемое значение fopen(3), которое возвращает NULL, когда не удается открыть файл.
  • sizeof( struct buf ) сообщает вам размер структуры, тогда как sizeof( buf ) дает вам размер переменной buf, то есть указателя, который составляет 4 или 8 байтов в зависимости от платформы.
0 голосов
/ 18 ноября 2010

попробуйте изменить fwrite на:

fwrite(buf, sizeof(struct buf), MAX_FILE_SIZE, fp);

Вы выделили struct buf * buf, чтобы выделить память для MAX_FILE_SIZE числа данных struct buf.

Оператор If может также быть проблемой;однако мне нужно знать, какой код находится вокруг него - выполняется ли это в цикле и т. д.

0 голосов
/ 18 ноября 2010

Как общее практическое правило, всегда проверяйте ошибки функций ввода-вывода и системных вызовов в целом с соответствующим кодом обработки ошибок, т.е. return (1).Попробуйте запустить функции такого типа в операторе if и обработайте запись / отладку / выход в операторе.

0 голосов
/ 18 ноября 2010

Первое, что нужно сделать: запустить его под отладчиком.Какая строка вызывает segfault?

Кроме того, sizeof(buf) всегда будет давать вам 4 на обычной 32-битной машине, потому что вы берете размер указателя.

...