请问strcpy的重叠是什么意思

比如像这样
char s[]="Hello World";
strcpy(s+1,s);
puts(s) ;

输出的时候前面多出来一个H,似乎是正确的

2个回答

1. 在说明该重叠现象之前,先看下图就可以一目了然了。

图片说明

2. 因为字符数组后面会自动添加一个字符串结束符“\0”,所以这里
strcpy(s+1,s);
或许不会出问题,但是若是strcpy(s+1000, s). 就有大概率dump掉进程。所以在进行内存地址重叠时候,要保证其原始空间足够。
若超出了其能够容纳字符串的地址空间,操作系统会感知到当前是属于非法操作内存空间,则直接的回应就是dump掉程序,避免带来
系统级别的灾难。

若有帮助,还望采纳。谢谢!!!!

strcpy这个函数,在编写的时候,考虑到了复制的目标和原字符串所处的范围一致的情况。源地址和目的地址重叠,高字节向低字节拷贝。

如果不考虑重叠:

#include <stdio.h>
void strcpy1(char * s1, char *s2)
{
    while (*s2)
    {
        *s1 = *s2;
        s1++;
        s2++;
    }
    *s1 = '\0';
}
int main()
{
    char s[]="Hello World";
    strcpy1(s+1,s);
    puts(s);

   return 0;
}

这么编写出来的代码就会因为s+1的[i]正好是s的[i+1]而把原始字符串冲坏造成错误。

支持重叠的版本,也就是和你看到的一样的输出

#include <stdio.h>
void strcpy1(char * s1, char *s2)
{
    if (s1 < s2)
    {
        while (*s2)
        {
            *s1 = *s2;
            s1++;
            s2++;
        }
        *s1 = '\0';
    }
    else        
    {
        int n = 0, i;
        char * s21 = s2;
        while (*s21) { n++; s21++; }
        for (i = n; i >= 0; i--)
        {
            s1[i] = s2[i];
        }
    }
}
int main()
{
    char s[20]="Hello World";
    strcpy1(s+1,s);
    puts(s);

   return 0;
}

HHello World

caozhy
贵阳老马马善福专业维修游泳池堵漏防水工程 回复A!ive: 不是,只要你缓冲区足够大,放心使用。我说了,strcpy是可以支持重叠拷贝的。
11 个月之前 回复
weixin_45740178
A!ive 也就是这样的用法不建议,或者说容易出问题对吗
11 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐