C++拷贝函数的一个问题

我定义了一个长度为8的字符数组b,和一个长度为2的字符数组c,将b拷贝给c,为什么可以成功拷贝,c的长度不是不够吗,为什么还可以成功拷贝,而且还可以输出c[6],c的总长... 我定义了一个长度为8的字符数组b,和一个长度为2的字符数组c,将b拷贝给c,为什么可以成功拷贝,c的长度不是不够吗,为什么还可以成功拷贝,而且还可以输出c[6],c的总长度只有2啊,而且我输出它们的长度也是8和2。为什么可以这样拷贝? 展开
 我来答
memberwin
2014-04-09 · TA获得超过3903个赞
知道大有可为答主
回答量:1000
采纳率:100%
帮助的人:514万
展开全部

strcpy函数并不保证目标字符串有足够空间---这个需要程序员自己保证---其只是从从目标字符串的起始地址开始复制源字符串的各个字符,直到源字符串的尾部'\0';所以复制是可以的。

不过c数组之后的的内存已经被破坏,如果后续还有变量声明则可能破坏该变量的值,更严重的可能写入程序的代码区,从而导致程序崩溃。

sizeof函数只是返回数据类型或变量的大小,所以sizeof(b)=8, sizeof(c)=2,因为当时分配就给了这么大的空间, 要察看字符串长度应该用strlen(c)函数,其中c是 const char *;

可以通过以下程序来验证:

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

int main()
{
        char a[8] = "abcdefg";
        char b[2];
        char c[2];
        strcpy(b, a);
        printf("%s\n",c);
        printf("%x %x\n", b, c);
        printf("%d,%d,%d\n", sizeof(a), sizeof(b), strlen(b));
        return 0;
}
春误双卿
2014-04-09 · TA获得超过725个赞
知道小有建树答主
回答量:580
采纳率:91%
帮助的人:459万
展开全部
这是windows检测机制不严格,你这个代码在linux下运行,就会奔溃了,而且在windows下,可能没有涉及到重要的内存,所以没有异常中断。其实这个已经内存溢出了,所以写代码的时候,还是要自己去控制代码的健壮性,不能依赖函数本身。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式