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 HFSS 中的 H 场图与 MATLAB 中绘制的 B1 场 部分对应不上
  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?