免费注册 查看新帖 |

Chinaunix

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

[已解决,谢谢热心网友]请教一个简单的字符比较程序 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-12-05 19:27 |只看该作者 |倒序浏览
本帖最后由 dacaisha 于 2010-12-07 11:27 编辑

各位高手大家好:

近日,我在red hat linux中用C编写了一段程序,代码如下:

#include<stdio.h>
#include<string.h>
main()
{
        char *p[3]={"how","are","you"};
        char *a[3];
        int i,j,k;
        for(i=0;i<3;i++)
        {
                printf("Input a comparable string\n");
                gets(a);                                                /*输入比较字符串*/
        }
        for(i=0;i<3;i++)
        {
                if((j=strcmp(p,a))==0) k++;
        }
       
        if(k==3) printf("Correct!!\n");                                /*字符串都相等*/
        else printf("Incorrect!!\n");       
}
用gcc生成可执行文件后,运行会出现错误。用gdb调试时发现:在比较p[0]与a[0]、p[1]与a[1]时,程序都正常。但是比较p[2]和a[2]时,错误提示p[2]地址超出有效范围。我们在刚开始的时候已经对*p[]进行了初始化了,为什么还会出现这个错误提示呢??而且p[0]、p[1]运行完后的地址都与初始化的地址一样,为什么只有P[2]的地址变化了,而且还超出有效范围呢??


-----------------------------------------------------------------------------------------------------分割线------------------------------------------------------------------------------------------------
为了进一步研究这个问题,我又写了一下代码:
1     #include<stdio.h>
2     #include<string.h>
3          main()
4             {
5
6          int y;
7        char *p="hello";
8        char *a;
9        gets(a);                            /*输入字符串*/
10        y=strcmp(p,a);
11        printf("%d",y);
12
13
14        }

此时运行程序,会出现Program received signal SIGSEGV, Segmentation fault.
但是用gdb调试时,程序却能通过。调试步骤如下:
(gdb)    b   10
  (gdb)      r
  (gdb)     s
  (gdb)     s
  (gdb)     c
  结果是:0, program exited with code 01.

为什么调试能通过,但是在终端中运行却通不过呢,而且在gdb中,直接run的话也是出现相同的错误提示。





还望各路高手多多指点啊!!!!!!

论坛徽章:
0
2 [报告]
发表于 2010-12-05 22:41 |只看该作者
不知道楼主用的是什么编译器。我用的gcc 4.4,编译运行报段错误。 因为char *a[3];指向未知地址。还有楼主k都没有初始化应该也不行吧。

下面那个应该是一样的,指针指向的是未知的地址,估计那块不允许写吧

论坛徽章:
0
3 [报告]
发表于 2010-12-06 00:06 |只看该作者
谢谢楼上的回答。。我程序中没有用到a[3]啊, 只用到了a[2],a[2]是指向我们所输入的第三个字符串的首地址啊.. 而且初始化中已经给p[2]赋值了啊,为什么运行后P[2]也指向了非法地址呢??

论坛徽章:
0
4 [报告]
发表于 2010-12-06 11:03 |只看该作者
楼主去man一下gets, gets把stdin读到的存入参数s指向的地址中,你的a指针数组只定义了,没有赋值,当然会错误.

论坛徽章:
0
5 [报告]
发表于 2010-12-06 13:25 |只看该作者

看书,出问题了Gdb

论坛徽章:
0
6 [报告]
发表于 2010-12-06 18:57 |只看该作者
哈哈,谢谢您们的指教,已经解决了。谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP