搜索
bottom↓
回复: 11

求教字符指针作为函数参数的问题

[复制链接]

出0入0汤圆

发表于 2014-4-29 10:31:11 | 显示全部楼层 |阅读模式
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
void catstr(char *dest,char *src);

void main()
{
        char *dest,*src="help you?";
        src=(char *)malloc(256);
        if((dest=(char *)malloc(80))==NULL)
        {
                printf("no memory\n");
                exit(1);
        }
        dest="Can I ";
        catstr(dest,src);
        puts(dest);
}

void catstr(char *dest,char *src)
{
        int i=0;
        while(*dest)        dest++;
        for(i=0;i<9;i++)
        {
                *dest=*src;
                src++;
                dest++;
        }       
}
以上是我的代码,可是一运行就显示停止运行,单步调试显示这个    test1_4.exe 中的 0x0116151a 处未处理的异常: 0xC0000005: 写入位置 0x011657c6 时发生访问冲突   。
想实现两个字符串连接起来,求各路高手指点怎么实现啊,这个程序是郭天祥那本书的例子,不知道为啥用不了。

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2014-4-29 10:40:31 | 显示全部楼层
内存泄露了。
dest="Can I "; 应该改成strcpy( dest, (char *)"Can I" )

出0入42汤圆

发表于 2014-4-29 11:08:26 | 显示全部楼层
转一圈回来ls就抢走了沙发...

出0入0汤圆

发表于 2014-4-29 11:13:04 | 显示全部楼层
本帖最后由 aozima 于 2014-4-29 13:05 编辑
welcome_cool 发表于 2014-4-29 10:40
内存泄露了。
dest="Can I "; 应该改成strcpy( dest, (char *)"Can I" )

  1. dest="Can I ";
复制代码
指向只读空间,然后对其进行了写操作。编译器会有警告的,无视者会杯具。

  1. for(i=0;i<9;i++)
  2.         {
  3.                 *dest=*src;
复制代码
这种代码会造成缓冲区溢出,哪天一不小心改错了9,256,80这3个数值的大小,就死了。

dest 先是malloc出来的,然后就直接 dest=“fuck"
这才是内存泄露。

怎么说呢,回炉重练吧。

出0入0汤圆

发表于 2014-4-29 11:22:31 | 显示全部楼层
aozima 发表于 2014-4-29 11:13
指向只读空间,然后对其进行了写操作。编译器会有警告的,无视者死。

这种代码会造成缓冲区溢出,哪天一 ...

看清楚再说了。
dest="Can I "; 应该改成strcpy( dest, (char *)"Can I" ) 。
改成strcpy( dest, (char *)"Can I" ) 还有泄露?

出0入0汤圆

发表于 2014-4-29 13:20:39 | 显示全部楼层
弄了半天发现有几个问题:
1、src指向只读空间,后面又拿去赋值(*dest=*src),是不行的。
2、src先赋值为字符串,然后才malloc,这样指针就变了,不指向字符串了。

作如下修改在C-FREE下编译通过:
  1. #include<stdio.h>
  2. #include<malloc.h>
  3. #include<stdlib.h>
  4. #include <string.h>
  5. void catstr(char *dest,char *src);

  6. int  main()
  7. {
  8.         char *dest;
  9.                 char *src;
  10.        
  11.         src=(char *)malloc(256);
  12.       
  13.         strcpy(src,"help you?");
  14.         
  15.         if((dest=(char *)malloc(80))==NULL)
  16.         {
  17.                 printf("no memory\n");
  18.                 exit(1);
  19.         }
  20.       
  21.         strcpy(dest,"Can I ");
  22.         puts(dest);
  23.         puts(src);
  24.         catstr(dest,src);
  25.                
  26.         puts(dest);
  27.         
  28.         return 0;
  29. }

  30. void catstr(char *dest,char *src)
  31. {
  32.         int i=0;
  33.         int slen=strlen(src);
  34.         
  35.         while(*dest) dest++;
  36.         
  37.        for(i=0;i<=slen;i++)
  38.         {
  39.                 *dest=*src;
  40.                 src++;
  41.                 dest++;
  42.                
  43.         }      
  44. }
复制代码

出0入0汤圆

 楼主| 发表于 2014-4-29 16:24:10 | 显示全部楼层
welcome_cool 发表于 2014-4-29 10:40
内存泄露了。
dest="Can I "; 应该改成strcpy( dest, (char *)"Can I" )

搞定了,大神就是多啊,自己研究了代码半天也没想明白哪写错了,原来是这样溢出了,多谢

出0入0汤圆

 楼主| 发表于 2014-4-29 16:29:20 | 显示全部楼层
jzkn 发表于 2014-4-29 13:20
弄了半天发现有几个问题:
1、src指向只读空间,后面又拿去赋值(*dest=*src),是不行的。
2、src先赋值为字 ...

谢大神,用改好的代码,明白了,主要还是对指针理解不够啊,试着一写程序就跑飞。大神,我这个函数指针用完后不需要再释放吗?

出0入0汤圆

 楼主| 发表于 2014-4-29 16:41:51 | 显示全部楼层
aozima 发表于 2014-4-29 11:13
指向只读空间,然后对其进行了写操作。编译器会有警告的,无视者会杯具。

这种代码会造成缓冲区溢出,哪 ...

谢大神了

出0入0汤圆

发表于 2014-4-29 16:56:08 | 显示全部楼层
srtthree 发表于 2014-4-29 16:29
谢大神,用改好的代码,明白了,主要还是对指针理解不够啊,试着一写程序就跑飞。大神,我这个函数指针用 ...

我不是大神哈,也是看了你的帖子又去重新学习了一下,呵呵。关于释放,可以看下面的从网页上拷贝来的:

只有动态分配的变量需要释放,如用malloc开辟的空间;

静态变量不需要释放,因为他在程序执行过程中一直存在,比如全局变量,和用static修饰的局部变量;
常量也不需要释放,因为他在程序执行过程中一直存在,比如char *p="hello world!";
局部变量也不需要释放,因为他用的是栈上的空间,会随着函数的结束而自动释放。

出0入0汤圆

 楼主| 发表于 2014-4-29 17:12:48 | 显示全部楼层
jzkn 发表于 2014-4-29 16:56
我不是大神哈,也是看了你的帖子又去重新学习了一下,呵呵。关于释放,可以看下面的从网页上拷贝来的:

...

原来如此,懂了,指针用活了还是挺难得。谢了,这个是静态变量不用释放了

出0入0汤圆

发表于 2014-4-29 18:35:22 来自手机 | 显示全部楼层
必须要释放呀,否则最后成野指针了
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 03:45

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表