Ошибка сегментации в C с fread и fwrite, хотя я использовал malloc

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

В этом случае мне кажется, что следующий снимок выглядит довольно просто: открытие нового файла для записи, открытие исходного файла, создание outdata для хранения достаточного количества байтов, чтение точного значения байтов из источника и запись в новый файл с помощью fwrite с одинаковыми параметрами.

Есть ли что-то фундаментальное, что я здесь отсутствует?

 int main (void) { FILE *outimg = fopen("test.jpg", "w"); FILE *rawFile = fopen("source.file", "r"); if(rawFile==NULL) { fprintf(stderr, "Unable to open source file\n"); return 1; } int chunkSize = 512; int picChunkCount = 440; unsigned char *outdata = malloc(chunkSize*picChunkCount*sizeof(unsigned char)); if(outdata==NULL) { fprintf(stderr,"Unable to allocate memory for *outdata\n"); return 2; } fread(&outdata, sizeof(unsigned char)*chunkSize*picChunkCount,1, rawFile); fwrite(&outdata, sizeof(unsigned char)*chunkSize*picChunkCount, 1, outimg); } 

Просто удалите & в fread и fwrite .

Это потому, что outdata уже указывает на местоположение, выделенное malloc() .

PS Не забудьте free(outdata);

Две вещи отсутствуют:

  • Вы читаете и записываете байты , поэтому вам нужно указать параметры fopen для wb и rb
  • Не проверять возврат fopen, fwrite и error при распределении памяти.

Наконец, лучше выделять память последовательно: если ваш файл весит 20 Гб, но доступно только 10 ГБ RAM – что-то плохое произойдет.

Попытайтесь использовать это:

 #include  #include  #define CHUNK 512 int main () { FILE *inputFile; FILE *outputFile; unsigned char *buffer; size_t nread; buffer = malloc(CHUNK); if (!buffer) exit(1); inputFile = fopen("input.txt", "rb"); outputFile = fopen("output.txt", "wb"); if (!inputFile || !outputFile) exit(2); while ((nread = fread(buffer, 1, CHUNK, inputFile)) > 0) fwrite(buffer, 1, nread, outputFile); if (ferror(inputFile) || ferror(outputFile)) exit(3); free(buffer); fclose(inputFile); fclose(outputFile); return 0; }