诡异又霸道的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()如此的霸道……求解!~