【问题标题】:fputc can't handle large files? Segmentation Fault 11fputc 不能处理大文件?分段错误 11
【发布时间】:2018-05-15 19:52:02
【问题描述】:

我在使用 fputc 时遇到问题 - 也许有人可以提供帮助。 我在开始时分配了一些存储空间并分配给 data[0] = 'B' 和 data[1] = 'M' - 数组的其余部分填充了数字。然后将数据写入.bmp-File:

//this scenario works

unsigned long *data;
data = malloc(55);

data[0] = 'B';
data[1] = 'M';

data[2] = 34;
data[3] = 0;
.
.
.
data[55] = 0;

unsigned long long i;
FILE *output;

output = fopen("output.bmp", "wb+"); 
if(output==NULL) {
    printf("ERROR writing files!\n");
}

 for( i = 0; i < 55; i++)               
 {                                          

    fputc(data[i], output);
 }

 fclose(output);

其余的 (data[2] - data[55]) 用数字填充。当我将数据写入 .bmp 文件时,一切正常(在此示例中,我生成了一个蓝色 1px)。现在,如果我想要一个更大的 .bmp 文件,例如:

//this scenario doesn't work

unsigned long *data;
data = malloc(300000);

data[0] = 'B';
data[1] = 'M';

data[2] = 34;
data[3] = 0;
.
.
.
data[300000] = 0;

unsigned long long i;
FILE *output;

output = fopen("output.bmp", "wb+"); 
if(output==NULL) {
    printf("ERROR writing files!\n");
}

 for( i = 0; i < 300000; i++)               
 {                                          

    fputc(data[i], output);
 }

 fclose(output);

出现以下错误:

分段错误:11

我发现,它工作的 malloc 的最后一个大小是 malloc(130000) - 之后就不起作用了。 有谁知道,我怎样才能摆脱这个问题?

我也尝试将 fputc 更改为 fwrite - 失败。

非常感谢! 问候

【问题讨论】:

  • 第一件事——检查 malloc 的返回值
  • unsigned long *data; data = malloc(N); data[0] = 'B'; data[1] = 'M'; . data[N] = 0; --> 分配大小错误。取而代之的是data = malloc(sizeof *data * (N + 1));
  • 如果内存不足,malloc 可能会返回 NULL。你能不能直接在malloc 后面写一个守卫,比如 `if ( NULL == data ) { fprintf( stderr, "malloc failed\n" );退出(1); }
  • 我确实使用以下代码检查了 malloc:if(!data) { free(data);返回0; } 没有出现任何故障

标签: c file segmentation-fault malloc fwrite


【解决方案1】:

这是错误的,因为它需要 300,000 * sizeof(long) 字节,但你只分配了 300,000 字节

unsigned long *data;
data = malloc(300000);

我认为你需要(因为你似乎在写字节)

unsigned char *data;
data = malloc(300000);

或(不太可能)

unsigned long *data;
data = malloc(300000 * sizeof(long));

【讨论】:

  • OP 的data[300000] = 0; 暗示需要更大的分配。 OTOH,data[300000] = 0; 本身不需要。
  • 啊,是的,我错过了最后一行。所以需要malloc(300001)
猜你喜欢
  • 2011-11-19
  • 2022-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-13
  • 1970-01-01
  • 2012-09-27
相关资源
最近更新 更多