首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 关于这个小程序的段错误
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • RookieAC
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 揭帖率:
    发表于:2008-08-21 12:49:37 楼主
    #include <stdio.h>
    void mystrcat(char *s,char *t)
    {
            while(*s)
                    ++s;
            while(*s++=*t++)
                    ;
    }

    main()
    {
            char *s="ab";char *t="cd";

            char *p=s;
            printf("%s\n",p);
            printf("%d",sizeof(t));
            mystrcat(s,t);
            printf("%s\n",p);
    }

    用gcc编译,提示说段错误,望有人可以帮着解释一下!
    20  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hqin6
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-21 12:51:351楼 得分:0
    No problems!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xkyx_cn
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 2

    发表于:2008-08-21 12:53:532楼 得分:0
    s,t指向字符串常量区,不可以改写其内容

    可以用数组,记得源字符串的空间要足够大,能容纳下连接后的字符串:
    char s[10] = "ab";
    char t[5] = "cd";
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • matrixcl
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-21 12:56:323楼 得分:0
    2楼正解。
    楼主的代码就算编译通过运行也是要出错的,内存越界。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lbh2001
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-21 12:58:094楼 得分:0
    引用 2 楼 xkyx_cn 的回复:
    s,t指向字符串常量区,不可以改写其内容

    可以用数组,记得源字符串的空间要足够大,能容纳下连接后的字符串:
    char s[10] = "ab";
    char t[5] = "cd";


    我觉得t无所谓,只要s必须定义为长度足够大的字符数组即可,因为要写入。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xqls_xqls
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-21 12:58:515楼 得分:0
    while(*s++=*t++)  改为:
    while(*s++==*t++)
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • taojian_hhu
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-21 13:10:296楼 得分:0
    s的空间至少要等于原来s的字符数+t的字符数+1
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • RookieAC
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-21 13:10:477楼 得分:0
    引用 4 楼 lbh2001 的回复:
    引用 2 楼 xkyx_cn 的回复:
    s,t指向字符串常量区,不可以改写其内容

    可以用数组,记得源字符串的空间要足够大,能容纳下连接后的字符串:
    char s[10] = "ab";
    char t[5] = "cd";


    我觉得t无所谓,只要s必须定义为长度足够大的字符数组即可,因为要写入。


    是这样的,这些我都清楚!
    我只是想理解下深层次的段错误的原因!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lbh2001
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-21 13:11:188楼 得分:0
    引用 5 楼 xqls_xqls 的回复:
    while(*s++=*t++)  改为:
    while(*s++==*t++)

    这一改就无法完成任务啰,三思,阿弥陀佛
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lala_benben
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-21 13:46:099楼 得分:0
    引用 2 楼 xkyx_cn 的回复:
    s,t指向字符串常量区,不可以改写其内容

    可以用数组,记得源字符串的空间要足够大,能容纳下连接后的字符串:
    char s[10] = "ab";
    char t[5] = "cd";
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • tgh621
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-21 13:48:3410楼 得分:0
    char *s="ab";char *t="cd";
    s指向的是静态区,你不能对s指向的数据进行操作
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • realdragon2
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-21 14:29:3711楼 得分:0
    深层次原因就是s所指向的字符串常量位于内存常量区,是不可写的; 需要将s设置为数组变量或者用malloc函数申请内存;
    比如:
    char s[10]="ab"; 此时开辟的10个字节的空间位于内存的栈区,可写.
    或者: s=(char *)malloc(10). 再写入.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • yuhaozx
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-21 15:44:5212楼 得分:0
    1、
      学习
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lunarfan
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-21 16:11:3213楼 得分:0
    常量区常量区不可改写,改用字符数组
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved