问题描述
- C语言指针,字符串复制过程的问题
-
下面是字符串复制的代码,str1[]如果限定大小为10,则会溢出,结果是s2正常,s1输出为 u?请问为什么是这个结果呢?
#include
#includeint main()
{
char *s1;
char *s2;
char str[] = {""How are you?""};
char str1[10]={};
s1 = str;
s2 = str1;
while ((*s2 = *s1) != ''){
s2++;
s1++;
}
s1 = str;
s2 = str1;
printf(""s1: %sns2: %sn"" s1 s2);
return 0;
}
解决方案
首先,要了内存栈地址分布。
在一般操作系统中栈地址从高地址往低地址分布。栈底是高地址,栈顶是低地址。局部变量是按顺序压入栈中。
其次,要了解局部变量的内存分布
程序中有4个局部变量。分别是2个char指针和2个char数组。在32位机上,指针占四个字节,所以s1s2分别占四个字节。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,?,。所以这时候打印str的值就是u?.
时间: 2024-11-03 16:28:13