| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 528 人关注过本帖
标题:诡异又霸道的strcpy()
取消只看楼主 加入收藏
pedone_c
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2011-7-26
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:1 
诡异又霸道的strcpy()
大家都知道,为指针分配内存时,如果内存分配大小不够时,就会导致出现越界的错误。但是我一天在使用用字符串复制函数strcpy(dst,src)时,误用了sizeof(src)作为大小来给*dst分配空间,但是有编译和运行的时候均没有报错,再继续调试更是发现更加诡异的事……这里先的程序贴上来(注:我是用GCC进行编译的):

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main()
{
    char *src="abcdefgh";
    char *dst=NULL;

    printf("sizeof(src)=%d\n",sizeof(src));
    dst=(char *)malloc(sizeof(src));
    strcpy(dst,src);
    printf("dst_add=%x\tdst:%s\n",dst,dst);
   
    src=NULL;
    dst=NULL;

}

打印出来的结果:
Sizeof(src)=4
Dst_add=8d87008    dst:abcdefgh

第一个诡异的事出来了:由sizeof(src)=4知道给dst所指地址分配了4个这节,而src中字符长度为9个字节,显然内存大小不够,但程序不但没有报错,而且自行延拓了空间。

下面再把程序修改一下:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main()
{
    char *src="abcdefgh";
    char *dst=NULL;
    char *dst2=NULL;

    printf("sizeof(src)=%d\n",sizeof(src));
    dst=(char *)malloc(sizeof(src));
    dst2=(char *)(dst+4);
    printf("dst_add=%x\tdst2_add=%x\n",dst,dst2);
    strcpy(dst2,"pedone");
    printf("dst2:%s\n",dst2);
    strcpy(dst,src);
    printf("src_add=%x\n",src);
    printf("dst_add=%x\tdst:%s\n",dst,dst);
    printf("dst2_add=%x\tdst2:%s\n",dst2,dst2);

    src=NULL;
    dst=NULL;
    dst2=NULL;

}

打印出来的结果:
Sizeof(src)=4
Dst_add=932e008 dst2_add=932e00c
//此处说明dst2 所指地址确实是在dst的基础上加4个字节
Dst2:pedone    //说明dst2所指地址中确实已复制时字符串"pedone"
Src_add=8048634  //用来说明dst和dst2并非指向src所指地址
Dst_add=932e008  dst:abcdefgh
Dst2_add=932e00c  dst2:efgh


第二个诡异的事也出来了:从上面的结果可以看出,在dst2所指地址,也就是dst所指地址加上4个字节的地址处,放入字符串“pedone”,它显然占据了要将“abcdefgh\0”这9个字符放入dst所地址后面的内存空间。大家看,再将"abcdefgh\0"这个字符串复制到dst所指地址后,鸠占鹊巢啊!!它硬是活生生的把str2所指地址中的内容踢走了,而且还把别人改名换姓了,把str2地址内容变成str1的了,真的不得不感叹strcpy()你太霸道了啊!!

高手说说为何strcpy()如此的霸道……求解!~
搜索更多相关主题的帖子: 内存 include 字符串 
2011-07-26 23:40
pedone_c
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2011-7-26
收藏
得分:0 
谢谢大家 作为一个初学者 在这里学习了……
2011-07-27 08:54
快速回复:诡异又霸道的strcpy()
数据加载中...
 
   



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

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