strcpy()字符数组大小不匹配的结果问题。

来源:百度知道 编辑:UC知道 时间:2024/07/05 08:46:08
#include <stdio.h>
#include <string.h>
void main()
{
char sourse[]="beijing
char target[10];
strcpy(target,sourse);
printf("源字符串=%s",sourse);
printf("\n目标字符串=%s\n",target);
}

1:我把target[]的大小改为小于sourse的位数比如5,6,结果都没变,但是改成4以下,输出的源字符串就会变成ing,而输出的目标字符串不变。为什么?
2:在beijing中间加入空格,bei jing。再改target为小于9位的数,输出的源字符串变成空白的。而输出的目标字符串也没变。为什么?
还有,在用strcat连接字符串的时候也是一样,如果大小不匹配,输出的源字符串会改变,而目标字符串反而不变。

呵呵,这个问题有点难哦,因为涉及到数组的内存分配问题,要求加点分哦
现在我来给你详细解释一下:
我们知道,在系统内,内存是一段一段的,而且是每四个字节一段

在定义数组的时候,
如果你有如下定义:
char target[10];
那么系统不会就真的只给你10*strlen(char)个字节的内存,而是分配给你12个,也就是说要是4的倍数,如果你申请的不是4的倍数,则自动补给你。

为了验证这个说法,我在你的主函数里加了两条测试语句:
void main()
{
char source[]="beijing";
printf("%x\n",source); //打印首地址
char target[9]; //我这里要9个字节的内存
printf("%x\n",target); //打印该字符数组的首地址
strcpy(target,source); //执行拷贝函数
printf("%s\n",source);
printf("%s\n",target);
}
运行结果如下
12ff78 //source的首地址
12ff6c //target的首地址
beijing
beijing
Press any key to continue
可以看出,完全没有问题,可以打印
但是,要注意两个首地址的差值为:12ff78-12ff6c=12
而且,关键是,target的首地址比source要大,也就是说,target数组在前,这才是问题的关键,因为,如果你申请的source的模太小的话,它将覆盖后面target数组的内容。

为了验证上面的说法,我将target[9]改为target[4],(注意,改为target[5]肯定不行,因为系统给你会分配8字节,而source