免费注册 查看新帖 |

Chinaunix

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

[C] C语言编程的问题,求解 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-10-15 18:15 |只看该作者 |倒序浏览
我写了个函数,目的是删除字符串里的空格符。遇到了很奇怪的问题。如下
失败的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void strip(char *);
void strip (char *str)
{
        int num=0;
        char *head =str;
        char *temp = str;
        while (*temp++) num++;
        char *a = (char *)malloc(num*sizeof(char));
        if (a != NULL)
        {
                while (*str)
                {
                        if (*str == ' ')
                        {
                                str++;
                                continue;
                        }
                        *a++ = *str++;
                }
                *a = '\0';
                strcpy(head,a);
                free(a);
        }
        else
                puts("NULL pointer");
}

main()
{
        char name[]="ldkfkdfkdf fdf  1";
        strip(name);
        puts(name);
}
执行后报告错误
*** glibc detected *** ./a.out: munmap_chunk(): invalid pointer: 0x000000000b57901e ***
======= Backtrace: =========
/lib64/libc.so.6(cfree+0x166)[0x3848272856]
./a.out[0x40060f]
./a.out[0x40064f]
/lib64/libc.so.6(__libc_start_main+0xf4)[0x384821d994]
./a.out[0x4004b9]
======= Memory map: ========
00400000-00401000 r-xp 00000000 03:01 6828567                            /tmp/a.out
00600000-00601000 rw-p 00000000 03:01 6828567                            /tmp/a.out
0b579000-0b59a000 rw-p 0b579000 00:00 0                                  [heap]
3847e00000-3847e1c000 r-xp 00000000 03:01 4737748                        /lib64/ld-2.5.so
384801b000-384801c000 r--p 0001b000 03:01 4737748                        /lib64/ld-2.5.so
384801c000-384801d000 rw-p 0001c000 03:01 4737748                        /lib64/ld-2.5.so
3848200000-384834d000 r-xp 00000000 03:01 4737749                        /lib64/libc-2.5.so
384834d000-384854d000 ---p 0014d000 03:01 4737749                        /lib64/libc-2.5.so
384854d000-3848551000 r--p 0014d000 03:01 4737749                        /lib64/libc-2.5.so
3848551000-3848552000 rw-p 00151000 03:01 4737749                        /lib64/libc-2.5.so
3848552000-3848557000 rw-p 3848552000 00:00 0
384a600000-384a60d000 r-xp 00000000 03:01 4737758                        /lib64/libgcc_s-4.1.2-20080825.so.1
384a60d000-384a80d000 ---p 0000d000 03:01 4737758                        /lib64/libgcc_s-4.1.2-20080825.so.1
384a80d000-384a80e000 rw-p 0000d000 03:01 4737758                        /lib64/libgcc_s-4.1.2-20080825.so.1
2ab4b52c7000-2ab4b52c8000 rw-p 2ab4b52c7000 00:00 0
2ab4b52da000-2ab4b52dc000 rw-p 2ab4b52da000 00:00 0
7fff38173000-7fff38188000 rw-p 7ffffffea000 00:00 0                      [stack]
ffffffffff600000-ffffffffffe00000 ---p 00000000 00:00 0                  [vdso]
Aborted
################
以下是我换了数组的方式写了个
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void strip(char *);
void strip (char *str)
{
        int i=0;
        char *head =str;
        char temp[40];
        while (*str)
        {
                if (*str == ' ')
                {
                str++;
                continue;
                }
                temp[i] = *str++;
                i++;
        }
        temp[i] = '\0';
        strcpy(head,temp);
}

main()
{
        char name[]="ldkfkdfkdf fdf  1";
        strip(name);
        puts(name);
}

执行后是好的。结果是:ldkfkdfkdffdf1 ,空格没了。
我查了下,非常奇怪,第一个失败是往malloc分配内存的空间里写数据出的问题。
我是刚开始写C,求高手赐教,为啥第一是失败的?不胜感激

论坛徽章:
0
2 [报告]
发表于 2013-10-16 00:13 |只看该作者
本帖最后由 garyv 于 2013-10-16 00:14 编辑

第一段代码里面,while(1)执行完毕之后,此a非彼a,strcpy()会操作零长度字符串,free()对a操作必出问题。

论坛徽章:
0
3 [报告]
发表于 2013-10-16 00:51 |只看该作者
说点题外的,没必要malloc和第二段的temp数组,直接in-place改写,跳过空格就行了

比如
  1. char *p = str;
  2. while (*str) {
  3.         if (*str == ' ') {
  4.                 str++;
  5.                 continue;
  6.          }
  7.          *p++ = *str++;
  8. }
  9. *p = '\0';
复制代码

论坛徽章:
0
4 [报告]
发表于 2013-10-16 10:02 |只看该作者
非常感谢2位,不对比不知道自己有多么的愚蠢。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP