2 funiu817718 funiu817718 于 2014.08.19 20:51 提问

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
diqiu50   2014.08.19 22: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?.

funiu817718
funiu817718 解释的好详细啊!太感谢了!好人!
3 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!