Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
fputc可以';你不能处理大文件吗?分段故障11_C_File_Segmentation Fault_Malloc_Fwrite - Fatal编程技术网

fputc可以';你不能处理大文件吗?分段故障11

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

我在使用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;

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;}首先没有出现任何故障-检查malloc
unsigned 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));