即使我使用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); }
只需删除fread
和fwrite
。
那是因为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; }