| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 946 人关注过本帖
标题:将字符串反向输出 出现内存错误 (指针问题)
只看楼主 加入收藏
crazyjudas
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2012-4-5
结帖率:100%
收藏
已结贴  问题点数:5 回复次数:10 
将字符串反向输出 出现内存错误 (指针问题)
代码如下 ,已注释出现问题地方,另外本人刚开始学,希望知道此种错误的调试方法。
注:在windows 平台和 Linux平台都调试过


程序代码:
void reverse_string(char *string)
{
    char *end=string;
    char *begin=string;
    char swap;

    if(string!=NULL&&*string!='\0') //字符指针不为空,且字符串不为空
    {   
     for(end=string;end!='\0';end++)
            ;
          end=end-1;                      //指针退回到‘/0’之前
   
        while(end>begin)
         {
        swap=*end;
        *end=*begin;            //交换前后值,问题处在这里
        *begin=swap;
        end--;
        begin++

         }
   
   
    }
}
搜索更多相关主题的帖子: windows 内存 字符串 Linux 
2012-04-05 22:52
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
收藏
得分:0 
回复 楼主 crazyjudas
怎么调用的?入参是字符串指针还是字符数组?

总有那身价贱的人给作业贴回复完整的代码
2012-04-05 22:59
crazyjudas
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2012-4-5
收藏
得分:0 
回复 2楼 embed_xuel
入参是字符串指针 *string
2012-04-05 23:00
crazyjudas
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2012-4-5
收藏
得分:0 
回复 3楼 crazyjudas
程序代码:
int main (int argc,char * argv[])
{
    char *string="sdfasdfasdf";        

    reverse_string(string);

    printf("%s \n",string);

    return 1;
}
以上为主函数代码
2012-04-05 23:01
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
收藏
得分:0 
char*string="sdfasdfasdf";
改成char string[]="sdfasdfasdf";

总有那身价贱的人给作业贴回复完整的代码
2012-04-05 23:03
crazyjudas
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2012-4-5
收藏
得分:0 
回复 5楼 embed_xuel
不是这个问题,这两种方法定义是没有问题的。
crazyjudas@ubuntu:~$ make reverse_string
cc -Wall -g    reverse_string.c   -o reverse_string
reverse_string.c: In function ‘reverse_string’:
reverse_string.c:24:4: error: expected ‘;’ before ‘}’ token
make: *** [reverse_string] Error 1
crazyjudas@ubuntu:~$ make reverse_string
cc -Wall -g    reverse_string.c   -o reverse_string
crazyjudas@ubuntu:~$ ./reverse_string
Segmentation fault
crazyjudas@ubuntu:~$ make reverse_string
cc -Wall -g    reverse_string.c   -o reverse_string
crazyjudas@ubuntu:~$ ./reverse_string
Segmentation fault
crazyjudas@ubuntu:~$ valgrind ./reverse_string
==2367== Memcheck, a memory error detector
==2367== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al.
==2367== Using Valgrind-3.6.1-Debian and LibVEX; rerun with -h for copyright info
==2367== Command: ./reverse_string
==2367==
==2367== Invalid read of size 1
==2367==    at 0x8048471: reverse_string (reverse_string.c:18)
==2367==    by 0x80484DC: main (reverse_string.c:35)
==2367==  Address 0xffffffff is not stack'd, malloc'd or (recently) free'd
==2367==
==2367==
==2367== Process terminating with default action of signal 11 (SIGSEGV)
==2367==  Access not within mapped region at address 0xFFFFFFFF
==2367==    at 0x8048471: reverse_string (reverse_string.c:18)
==2367==    by 0x80484DC: main (reverse_string.c:35)
==2367==  If you believe this happened as a result of a stack
==2367==  overflow in your program's main thread (unlikely but
==2367==  possible), you can try to increase the size of the
==2367==  main thread stack using the --main-stacksize= flag.
==2367==  The main thread stack size used in this run was 8388608.
==2367==
==2367== HEAP SUMMARY:
==2367==     in use at exit: 0 bytes in 0 blocks
==2367==   total heap usage: 0 allocs, 0 frees, 0 bytes allocated
==2367==
==2367== All heap blocks were freed -- no leaks are possible
==2367==
==2367== For counts of detected and suppressed errors, rerun with: -v
==2367== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 11 from 6)

调试的结果是swap=*end; 出了问题 , 不知道为什么会这样。
我按照你说的改了,还是这样。
2012-04-05 23:10
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
收藏
得分:0 
有编译错误,看见了吗?

总有那身价贱的人给作业贴回复完整的代码
2012-04-05 23:17
crazyjudas
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2012-4-5
收藏
得分:0 
恩那是第一次的 第二次没错误了 在第一次下面

crazyjudas@ubuntu:~$ make reverse_string
cc -Wall -g    reverse_string.c   -o reverse_string
reverse_string.c: In function ‘reverse_string’:
reverse_string.c:24:4: error: expected ‘;’ before ‘}’ token
make: *** [reverse_string] Error 1
crazyjudas@ubuntu:~$ make reverse_string
cc -Wall -g    reverse_string.c   -o reverse_string
2012-04-05 23:23
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
收藏
得分:5 
还有一个错误:
for(end=string;end!='\0';end++)应该改为
for(end=string;*end!='\0';end++)

总有那身价贱的人给作业贴回复完整的代码
2012-04-06 06:38
crazyjudas
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2012-4-5
收藏
得分:0 
回复 9楼 embed_xuel
恩 是的 在linux下成功了 成功了 怎么会犯这种错误 。
因为之前是在windows下编译的,我还加了这个*号,当时还是一直有问题,我等下再去看看原来的代码。 谢谢了
2012-04-06 07:01
快速回复:将字符串反向输出 出现内存错误 (指针问题)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018327 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved