给定一段代码如下,其输出是什么?
#include<stdio.h>
#include<string.h>
int main(void){
char d[]="qwertyuioplkjhgfdsazxcvbnm";
char s[]="qwe";
strcpy(s,d);
//printf("%p\t%p\n",d,s);
printf("%s\n%s\n",d,s);
return 0;
}
VS2010上进行测试
CodeBlocks20.03上测试
**
查看内存地址,分析字符串的内存排里插入图片描述
**
VS2010
从打印的内存地址可以看出,Windows使用的是小端模式,字符从低到高进行排列,但是由于局部变量位于栈中,后声明的变量在在低地址处,而且其空间并不是与前一个变量紧密相连(VS2010),而是有空余的字节。由于strcpy()函数并不安全,只是把d(包括‘\0’)复制到s的空间上,导致s被覆盖,由于s的空间不够,向后覆盖的过程中也覆盖了部分的d中的空间。所以导致以上情况。
附:不同的编译器所造成的结果不同,编译器对内存的分配并不相同。
CodeBlocks20.03
d和s之间并未留出空间。二者紧密相连。