funiu666 2014-08-19 12:51 采纳率: 0%
浏览 2860

C语言指针,字符串复制过程的问题


下面是字符串复制的代码,str1[]如果限定大小为10,则会溢出,结果是s2正常,s1输出为 u?

请问为什么是这个结果呢?


#include
#include

int main()
{
char *s1;
char *s2;
char str[] = {"How are you?"};
char str1[10]={};
s1 = str;
s2 = str1;
while ((*s2 = *s1) != '\0'){
s2++;
s1++;
}
s1 = str;
s2 = str1;
printf("s1: %s\ns2: %s\n", s1, s2);
return 0;
}

  • 写回答

1条回答

  • diqiu50 2014-08-19 14:34
    关注

    首先,要了内存栈地址分布。
    在一般操作系统中栈地址从高地址往低地址分布。栈底是高地址,栈顶是低地址。局部变量是按顺序压入栈中。
    其次,要了解局部变量的内存分布
    程序中有4个局部变量。分别是2个char指针和2个char数组。在32位机上,指针占四个字节,所以s1,s2分别占四个字节。str长度是"How are you?"的长度+1(c string末尾有个0)占13个字节,str1初始化10个字节。

    由上假设:
    str1地址为1000,则str地址1010。根据while循环条件,while循环的赋值执行13次。他会把从1010-1022的内容复制到1000-1012。这时候会覆盖原来1010,1011,1012这三个地址值。这两个值恰好是u,?,\0。所以这时候打印str的值就是u?.

    评论

报告相同问题?

悬赏问题

  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 牛顿斯科特系数表表示
  • ¥15 arduino 步进电机