即使我使用malloc,C中的fread和fwrite也会出现分段错误

我一直致力于一个程序,由于分段错误而不断崩溃。 我裁掉了导致此问题的最简单的代码部分。 根据我到目前为止所学到的,如果我要求操作系统进行内存分配,然后使用指针读取和写入内存的那个地址,那么应该是好的。

在这种情况下,以下剪切看起来对我来说非常简单:打开一个新文件进行写入,打开源文件,创建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); } 

只需删除freadfwrite

那是因为outdata 已经指向了由malloc()分配的位置。

PS别忘了free(outdata);

缺少两件事:

  • 您正在读取和写入字节 ,因此您需要为wb和rb指定fopen参数
  • 在内存分配时不检查fopen,fwrite和错误的返回。

最后,最好一致地分配内存:如果你的文件重20Gb,但只有10Gb 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; }