一个经典的问题的思考: strcpy覆盖内存

来源:互联网 发布:少女漫画推荐 知乎 编辑:程序博客网 时间:2024/06/15 18:18

    下面程序会出现什么问题:

#include<stdio.h>#include<stdlib.h>int main(){    char s[]="123456789";    char d[]="123";    strcpy(d,s);    printf("%s,\n%s",d,s);    return 0;}

编译运行后结果是:



查看各个字节的地址    d的四个字节的地址分别为 fee2,fee3,fee4,fee5

                                         s的十个字节的地址分别为 fee6,fee7,fee8,fee9·······feef;

       压栈中向下生长,由高地址压入低地址,先压栈s中 ‘/0’ ,然后'9'8 7·············然后压入d的/0 3 2 1;



在strcpy前插入断点,运行前




运行过以后结果如下图所示:


可知  d为123456789

          s为56789

d和s内存连续 ,复制时将他们的某些值覆盖,才导致了上述问题,那么应该怎样解决呢?


1,可以这样改

#include<stdio.h>#include<stdlib.h>int main(){    char s[10]="123456789";    char d[10]="123";    strcpy(d,s);    printf("%s,\n%s",d,s);    return 0;}

2  这样改


#include<stdio.h>#include<stdlib.h>int main(){  char *s=(char*)malloc(10);  char *d=(char*)malloc(10)    strcpy(d,"123456789");    strcpy(s,"123456789");     printf("%s,\n%s",d,s);    return 0;}





1 0
原创粉丝点击