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 Visual Studio问题
  • ¥15 state显示变量是字符串形式,但是仍然红色,无法引用,并显示类型不匹配
  • ¥20 求一个html代码,有偿
  • ¥100 关于使用MATLAB中copularnd函数的问题
  • ¥20 在虚拟机的pycharm上
  • ¥15 jupyterthemes 设置完毕后没有效果
  • ¥15 matlab图像高斯低通滤波
  • ¥15 针对曲面部件的制孔路径规划,大家有什么思路吗
  • ¥15 钢筋实图交点识别,机器视觉代码
  • ¥15 如何在Linux系统中,但是在window系统上idea里面可以正常运行?(相关搜索:jar包)