fputc可以';你不能处理大文件吗?分段故障11
我在使用fputc时遇到问题-也许有人可以帮助我。 我在开始时分配了一些存储空间,并在数据[0]=“B”和数据[1]=“M”上分配了存储空间,数组的其余部分都用数字填充。然后数据将写入.bmp文件:fputc可以';你不能处理大文件吗?分段故障11,c,file,segmentation-fault,malloc,fwrite,C,File,Segmentation Fault,Malloc,Fwrite,我在使用fputc时遇到问题-也许有人可以帮助我。 我在开始时分配了一些存储空间,并在数据[0]=“B”和数据[1]=“M”上分配了存储空间,数组的其余部分都用数字填充。然后数据将写入.bmp文件: //this scenario works unsigned long *data; data = malloc(55); data[0] = 'B'; data[1] = 'M'; data[2] = 34; data[3] = 0; . . . data[55] = 0; unsigne
//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);
//此方案有效
无符号长*数据;
数据=malloc(55);
数据[0]=“B”;
数据[1]=‘M’;
数据[2]=34;
数据[3]=0;
.
.
.
数据[55]=0;
未签名的长i;
文件*输出;
output=fopen(“output.bmp”、“wb+”);
if(输出==NULL){
printf(“写入文件时出错!\n”);
}
对于(i=0;i<55;i++)
{
fputc(数据[i],输出);
}
fclose(输出);
其余的(数据[2]-数据[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);
//此方案不起作用
无符号长*数据;
数据=malloc(300000);
数据[0]=“B”;
数据[1]=‘M’;
数据[2]=34;
数据[3]=0;
.
.
.
数据[300000]=0;
未签名的长i;
文件*输出;
output=fopen(“output.bmp”、“wb+”);
if(输出==NULL){
printf(“写入文件时出错!\n”);
}
对于(i=0;i<300000;i++)
{
fputc(数据[i],输出);
}
fclose(输出);
出现以下错误:
分段错误:11
我发现,malloc的最后一个大小,它工作的地方是malloc(130000)——所有这些都不起作用。
有人知道我怎样才能解决这个问题吗
我还尝试将fputc更改为fwrite-失败
非常感谢!
问候语这是错误的,因为它需要300000*sizeof(长)字节,但您只分配300000字节
unsigned long *data;
data = malloc(300000);
我认为您需要(因为您似乎正在写入字节)
或(可能性较小)
这是错误的,因为它需要300000*sizeof(long)字节,但您只分配300000字节
unsigned long *data;
data = malloc(300000);
我认为您需要(因为您似乎正在写入字节)
或(可能性较小)
首先-检查malloc
unsigned long*数据的返回值;数据=malloc(N);数据[0]=“B”;数据[1]=“M”。数据[N]=0代码>-->错误的分配大小。而是data=malloc(sizeof*data*(N+1))
如果内存不足,malloc
可能返回NULL。你能不能直接在malloc
一个保护之后写一些东西,比如'if(NULL==data){fprintf(stderr,“malloc failed\n”);exit(1);}我确实用这个代码检查了malloc:if(!data){free(data);return 0;}首先没有出现任何故障-检查mallocunsigned long*数据的返回值;数据=malloc(N);数据[0]=“B”;数据[1]=“M”。数据[N]=0代码>-->错误的分配大小。而是data=malloc(sizeof*data*(N+1))
如果内存不足,malloc
可能返回NULL。你能在malloc
a保护之后直接写一些东西,比如'if(NULL==data){fprintf(stderr,“malloc failed\n”);exit(1);}我确实用这个代码检查了malloc:if(!data){free(data);return 0;}没有出现任何failureOP的data[300000]=0代码>意味着需要更大的分配。OTOH,数据[300000]=0代码>本身是不需要的。啊,是的,我错过了最后一行。因此需要malloc(300001)OP的数据[300000]=0代码>意味着需要更大的分配。OTOH,数据[300000]=0代码>本身是不需要的。啊,是的,我错过了最后一行。因此需要malloc(300001)
unsigned long *data;
data = malloc(300000 * sizeof(long));