linux下c语言编程出现段错误

int savetofile(RGBQUAD *pRGB,int width,int height){
FILE *fp;
char filename[50]="NULL";

printf("%s","Please Enter the save filename.txt\n");
scanf("%s",&filename);
fp = fopen(filename,"wb");
char rgbRed[3],rgbGreen[3],rgbBlue[3];
char *flag,*flag_width,*flag_height;
for (int i=0;i< height ;i++){
for (int j=0;j< width;j++){
sprintf(flag_height,"%03d",i+1);
sprintf(flag_width,"%03d",j+1);
flag=flag_height;
strcat(flag,flag_width);
//printf("%s",flag);
sprintf(rgbRed,"%d",pRGB->rgbRed);
sprintf(rgbGreen,"%d",pRGB->rgbGreen);fprintf(fp,"%s %-s %-s %-s\n",flag,rgbRed,rgbGreen,rgbBlue);
//printf("%3d %3d %3d\r\n", pRGB->rgbRed,pRGB->rgbGreen,pRGB->rgbBlue);
printf("%s %-s %-s %-s\n", flag,rgbRed,rgbGreen,rgbBlue);

pRGB++;
}
}
输入文件名后直接显示段错误,不知道哪个指针或者其它地方有问题?
感谢二楼的回答,我前面filename定义的数组,我也试了,一样是段错误
主函数太长 贴出一部分
main()
{.....
printf("保存到文本文件:\n");
savetofile(&dataOfBmp[0],width,height);
fclose(pfile);
if (bitInfoHead.biBitCount<24)
{
free(pRgb);
}
free(dataOfBmp);
free(pColorData);
printf("\n");
return 0;
.....}

简单看了一下你的程序
首先,你没有给出完整的程序,这个让大伙看起来确实不方便,因为没有main函数,可能踩内存的地方并不是这个函数本身,是main函数

其次说你的这个函数,貌似确实有点问题,但是由于没有完整的程序,我只说出我的理解,如果有错,直接忽视就好

sprintf(flag_height,"%03d",i+1);
sprintf(flag_width,"%03d",j+1);

我觉得问题出在这里,你查下 sprintf 的用法,第一个参数应该是一个字符串的首地址,你写的确实没有错,参数给入的是一个地址flag_height,但是纵观你的程序,你并没有给这个指针赋值,程序运行到这里,估计在默认创建指针的时候应该赋值为NULL(貌似根据编译器不同而有不同),那个寻址后报出段错误,也是意料之中了

由于没有你完整的代码,不知道你要做什么,修改意见不好提
给出个人意见,仅供参考

如果要打印flag_height中的值,首先应该给flag_height指针分配一片内存,使用malloc函数,其次在向内从中写入值,然后调用sprintf,就应该没有问题了
温馨提示:内容为网友见解,仅供参考
第1个回答  2010-05-03
scanf("%s",&filename);
改成
scanf("%s",filename);
再试试
第2个回答  2010-05-03
请写出完整程序。

c语言代码出现segmentation fault 的原因是什么?
segmentation fault 即段错误,一般都是出现了非法的地址写法操作导致的。常见的几种情况:1、空指针访问。如果指针为空(NULL), 那么对空指针的读写操作都会导致segmentation fault。2、指针指向非法区域后的写操作。C语言的指针指向了非法区域,然后对其写入,会带来不可预知后果,最严重的就是程序崩溃,...

C语言在linux下编译通过,一运行就段错误
linux里面段错误就是内存访问的错误了,应该是你代码里的内存分配有问题,因为没看到你这里的struct studen的具体定义,只能让你注意看下studen的name这个字符串的定义,txt文件里的name字段有没有超出这个name的定义长度,如果超出了,fscanf就会报内存错误了 ...

C语言编译之后出现Segmentation fault (core dumped)的错误
Linux下的段错误:Segmentation fault (core dumped)和Windows下的运行时错误道理是一样,一般都是内存被踩访问越界了导致。肯定是代码的某处逻辑有问题,访问了野指针啊之类的。

帮忙看下以下的C语言程序,哪里有问题了,为什么Linux上编译执行会出现段...
可能是strcpy(c,a);时越界,a中直到遇到'\\0'才会拷贝结束,你试试把a最后一个设为'\\0'

C语言中什么是、、段错误、、引起段错误的原因有哪些?
段错误就是指访问的内存超出了系统所给这个程序的内存空间,通常这个值是由gd tr来保存的,他是一个48位的寄存器,其中的32位是保存由它指向的 gdt表,后13位保存 相应于gdt的下标,最后3位包括了程序是否在内存中以及程序的在cpu中的运行级别,指向 的gdt是由以64位为一个单位的表,在这张表中就...

C语言中什么是、、段错误、、引起段错误的原因有哪些?
在编程中以下几类做法容易导致段错误,基本上是错误地使用指针引起的。所谓的段错误就是指访问的内存超出了系统所给这个程序的内存空间,段错误应该就是访问了不可访问的内存,这个内存区要么是不存在的,要么是受到系统保护的。段错误就是指访问的内存超出了系统所给这个程序的内存空间,通常这个值是由gd tr...

Linux下一个C语言程序 运行后出现Segmentation fault (core dumped...
您可以gcc -g标签,生成可调试的文件。出错后会生成一个core文件 您输入命令gdb a.out -c core,进入gdb的命令界面后,输入bt,就可以显示您当前发生段错误的代码。我运行的时候,一直输出"can not found"。

段错误的原因
问题一:C语言中什么是、、段错误、、引起段错误的原因有哪些? 大部分都是指针引起的,比如指针指向了非法空间,在对指针赋值前就使用,指针没初始化等。 问题二:C语言小问题 段错误是什么? 1. 段错误一般是当你访问了未申请的内存或非法的内存时产生的。主要还是程序的内存管理有问题。 2. 其实打开文件是将文件...

c语言编程出现Segmentation fault怎么办?
出现段错误\/非法内存访问可能是因为:你读的时候读的长度和你的输入有关,而实际上存在文件中的用户名密码长度不一定是你输入的长度。这时候(比如少读或多读一个字符),那么你的fgetc让文件指针移动之后就不会停在你想要的地方。发生错误最好的解决办法是调试。无论是简单的加printf语句,或是添加断点...

c语言问题,段错误.warning: assignment makes pointer from intege...
不用数组的话,长度不够,段错误是这个原因。另外,倒数第三行,可以改为a[i]='\\0'吧,警告就是这个原因,英文的翻译就是“赋值时将指针赋给整数,未作类型转换”。

相似回答