免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 7298 | 回复: 9
打印 上一主题 下一主题

为什么我的printf会导致段错误? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-06-28 02:02 |只看该作者 |倒序浏览
最近做课程设计写一个C程序,遇到一个奇怪的问题。WinXP下gcc可以正常运行的程序,到Linux下同样gcc会有莫名其妙的段错误,比如其中的一些printf(),单步执行过去出段错误,有些甚至只是简单的printf("Kaka");都会出段错误,去掉这句printf就没事了,所以应该也不会是周围的语句造成的。我试了试写一个只有printf()的C程序没有问题。

还有下面这个malloc也出现段错误:
if((reval = malloc(sizeof(int64_t)*length)) == NULL)
         {         fprintf(stderr,"Cannot allocate space for reval\n");
                 exit(1);
         }

但是WinXP下都可以通过。

对C一直一知半解,不知道这个问题问的是不是很白,但愿能得到指点,谢谢。程序挺长的,不好贴出来,下面是printf出错的部分:(代码写的比较丑,见谅)

if(*str++ != OBJECT_IDENTIFIER)
{
    fprintf(stderr,"Wrong in variable name field: %d\n",*(str-1));
    fprintf(stderr,"Pre: %d\tPost: %d\n",*(str-2),*(str));
    exit(1);
}
temp = *str;
//printf("Now is %d, pre is %d\n",*str, *(str-1));
//printf("Kaka");               
lennlen = 0;
if((temp & 0x80)!= 0)
{
    lennlen = temp & 0x7f;                       
    parseVB.var_name_length = parseLength((int *)(str+1),lennlen);
}
else {
    parseVB.var_name_length = temp;
    }

就是现在注释掉的两句有错。

[ 本帖最后由 neilchi 于 2007-6-28 10:06 编辑 ]

temp2.rar

4.04 KB, 下载次数: 59

完整代码:

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
2 [报告]
发表于 2007-06-28 02:16 |只看该作者
肯定是附近的哪个语句导致内存越界了。
你仔细检查程序中指针和数组的使用情况。

论坛徽章:
0
3 [报告]
发表于 2007-06-28 03:25 |只看该作者
怎么检查越界呢?我会简单使用GDB,但是不知道怎么去发现越界

另外,为什么我把这句printf("Kaka");注视掉就可以通过了……

论坛徽章:
0
4 [报告]
发表于 2007-06-28 08:31 |只看该作者
str 的类型?

论坛徽章:
0
5 [报告]
发表于 2007-06-28 09:42 |只看该作者
原帖由 langue 于 2007-6-28 08:31 发表
str 的类型?


#define OBJECT_IDENTIFIER 0x06

typedef struct VBParse {
    int64_t seq_length;
    int64_t var_name_length;
    int64_t var_value_length;
}Tool;

char *str;
int lennlen, temp;

Tool parseVB;

parseVB没有初始化会有问题吗?另外我刚刚注意到这段程序在parseVB(char *str, char *originalPos)函数里,这两个名字会有冲突吗?

[ 本帖最后由 neilchi 于 2007-6-28 09:46 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2007-06-28 09:51 |只看该作者
这么看,可真看不出来。你可以把程序用附件的形式传上来

论坛徽章:
0
7 [报告]
发表于 2007-06-28 09:57 |只看该作者
学会调试程序第一步:尝试用二分法裁减你的程序,直到程序不能再小而且错误还在。

论坛徽章:
0
8 [报告]
发表于 2007-06-28 10:03 |只看该作者
在gdb中运行程序,出现段错误后用bt命令查看一下栈信息,基本就能确定出错位置了

论坛徽章:
0
9 [报告]
发表于 2007-06-28 10:07 |只看该作者
原帖由 ivhb 于 2007-6-28 09:51 发表
这么看,可真看不出来。你可以把程序用附件的形式传上来


已传,代码写的比较差,我会努力

在XP下用DevCpp基本正确,但是回Linux就挂了……

论坛徽章:
0
10 [报告]
发表于 2007-06-28 10:09 |只看该作者
原帖由 cugb_cat 于 2007-6-28 10:03 发表
在gdb中运行程序,出现段错误后用bt命令查看一下栈信息,基本就能确定出错位置了

好,我试试
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP