读书人

C函数执行的时候报Segmentation fault

发布时间: 2013-03-01 18:33:02 作者: rapoo

C函数执行的时候报Segmentation fault的错误
最近写了一个字符反编码的函数,如字符'A'的编码为'41',通过下文中的unhex("41")函数可以直接返回符'A'.在TC中调试可以得到正确的结果,但是在linux下执行的时候一直报"Segmentation fault"的错误,所以麻烦各位帮忙看下原因,多谢!


#include "stdio.h"
#include "string.h"
char* unhex(char in_rp[50]);
int main()
{
char in_val[50];
char *gval;
/*clrscr();*/
printf("请输入16进制数: ");
scanf("%s",&in_val);
gval=unhex(in_val);
printf("gval: %s",gval);

return 0;
}
char* unhex(char in_rp[50])
{
int i=0;
int asc=0,bsc=0,absc=0;
int len=strlen(in_rp);
char arr[2],*result="";

if(in_rp=="")
{return "";}

else{

while(i<len)
{
switch(in_rp[i])
{
case '0' : asc=0;break;
case '1' : asc=1;break;
case '2' : asc=2;break;
case '3' : asc=3;break;
case '4' : asc=4;break;
case '5' : asc=5;break;
case '6' : asc=6;break;
case '7' : asc=7;break;
case '8' : asc=8;break;
case '9' : asc=9;break;
case 'A' : asc=10;break;
case 'B' : asc=11;break;
case 'C' : asc=12;break;
case 'D' : asc=13;break;
case 'E' : asc=14;break;
default : asc=15;break;
}

switch(in_rp[i+1])
{
case '0' : bsc=0;break;
case '1' : bsc=1;break;
case '2' : bsc=2;break;
case '3' : bsc=3;break;
case '4' : bsc=4;break;
case '5' : bsc=5;break;
case '6' : bsc=6;break;
case '7' : bsc=7;break;
case '8' : bsc=8;break;
case '9' : bsc=9;break;
case 'A' : bsc=10;break;
case 'B' : bsc=11;break;
case 'C' : bsc=12;break;
case 'D' : bsc=13;break;
case 'E' : bsc=14;break;
default : bsc=15;break;
}

absc=asc*16+bsc;
arr[0]=(char)absc;
arr[1]='\0';
result=strcat(result,arr);
i+=2;
}
return result;
}
}
Segmentation?fault c
[解决办法]
int len=sizeof(in_rp)/sizeof(char);
[解决办法]
printf里面的%和变量的一一对应关系
scanf里面的%和变量以及变量前加不加&的一一对应关系
是C代码中非常容易出错的地方,而且通常编译还不出错。
所以在编译源代码之前值得专门仔细检查一遍甚至多遍。

Windows:崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。
Linux:进程意外退出会在当前目录下产生形如‘core.数字’的文件比如‘core.1234’
使用命令
gdb 运行程序名 core.数字
进入gdb然后使用bt命令
可以查看进程意外退出前函数调用的堆栈,内容为从上到下列出对应从里层到外层的函数调用历史。
如果进程意外退出不产生core文件,参考“ulimit -c core文件最大块大小”命令


[解决办法]
scanf("%s",&in_val);
不需要&

if(in_rp=="")
这能这么比较么

result没分配空间

错误太多了,,,
[解决办法]

#include "stdio.h"
#include "string.h"
char* unhex(char in_rp[50]);
int main()
{
char in_val[50]={0};
char *gval;
/*clrscr();*/
printf("请输入16进制数: ");
scanf("%s",&in_val);
gval=unhex(in_val);
printf("gval: %s\n",gval);



return 0;
}
char* unhex(char in_rp[50])
{
int i=0;
int asc=0,bsc=0,absc=0;
int len=strlen(in_rp);
char arr[2];
char *result = (char*)malloc(len+2);

if(in_rp=="")
{return "";}

else{

while(i<len)
{
switch(in_rp[i])
{
case '0' : asc=0;break;
case '1' : asc=1;break;
case '2' : asc=2;break;
case '3' : asc=3;break;
case '4' : asc=4;break;
case '5' : asc=5;break;
case '6' : asc=6;break;
case '7' : asc=7;break;
case '8' : asc=8;break;
case '9' : asc=9;break;
case 'A' : asc=10;break;
case 'B' : asc=11;break;
case 'C' : asc=12;break;
case 'D' : asc=13;break;
case 'E' : asc=14;break;
default : asc=15;break;
}

switch(in_rp[i+1])
{
case '0' : bsc=0;break;
case '1' : bsc=1;break;
case '2' : bsc=2;break;
case '3' : bsc=3;break;
case '4' : bsc=4;break;
case '5' : bsc=5;break;
case '6' : bsc=6;break;
case '7' : bsc=7;break;
case '8' : bsc=8;break;
case '9' : bsc=9;break;
case 'A' : bsc=10;break;
case 'B' : bsc=11;break;
case 'C' : bsc=12;break;
case 'D' : bsc=13;break;
case 'E' : bsc=14;break;
default : bsc=15;break;
}

absc=asc*16+bsc;
arr[0]=(char)absc;
arr[1]='\0';
result=strcat(result,arr);
i+=2;
}
return result;
}
}


LZ试试这个代码,看能不能满足你的需求。
[解决办法]
if(in_rp=="")

这里 char* 不能 直接 比较是否为空,自己调试调试吧。。

result = new char[64];就分配空间了

读书人网 >C语言

热点推荐