【发布时间】: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