全局区/静态区(Global Static Area):并且在C语言中初始化的全局变量和静态变量放在同一个块,未初始化的全局变量放在另一个块(在C++中,由于全局变量和静态变量编译器会给这些变量自动初始化赋值,所以没有区分,都在一起)。
#include <cstdio>
#include <cstring>
using namespace std;
char a[5]={'A','B','C','D','E'};
//char c[5]={'0','1','2','3','4'};
//char e[10]={'0','1','2','3','4','5','6','7','8','9'};
char b[10]={'0','1','2','3','4','5','6','7','8','9'};
char d[10]={'a','b','c','d','e','f','g','h','i','j'};
char f[5]={'!','@','#','$','%'};
int main()
{
for(int i=0;i<5;i++){
printf("%c loc %x\n",a[i],&a[i]);
}
printf("---------------\n");
for(int i=0;i<10;i++){
printf("%c loc %x\n",b[i],&b[i]);
}
printf("---------------\n");
for(int i=0;i<10;i++){
printf("%c loc %x\n",d[i],&d[i]);
}
strcpy(a,b);
printf("--------strcpy-------\n");
// char *p=b;
//char *p1=a;
// for(int i=0;i<10;i++){
// *(p1+i)=*(p+i);
// }
for(int i=0;i<5;i++){
printf("%c loc %x\n",a[i],&a[i]);
}
// for(int i=0;i<5;i++){
// printf("%c\n",c[i]);
// }
//for(int i=0;i<10;i++){
// printf("%c\n",e[i]);
//}
printf("---------------\n");
for(int i=0;i<10;i++){
printf("%c loc %x\n",b[i],&b[i]);
}
printf("---------------\n");
for(int i=0;i<10;i++){
printf("%c loc %x\n",d[i],&d[i]);
}
return 0;
}
输出结果:
A loc 402000
B loc 402001
C loc 402002
D loc 402003
E loc 402004
---------------
0 loc 402005
1 loc 402006
2 loc 402007
3 loc 402008
4 loc 402009
5 loc 40200a
6 loc 40200b
7 loc 40200c
8 loc 40200d
9 loc 40200e
---------------
a loc 40200f
b loc 402010
c loc 402011
d loc 402012
e loc 402013
f loc 402014
g loc 402015
h loc 402016
i loc 402017
j loc 402018
--------strcpy-------
0 loc 402000
1 loc 402001
2 loc 402002
3 loc 402003
4 loc 402004
---------------
5 loc 402005
6 loc 402006
7 loc 402007
8 loc 402008
9 loc 402009
a loc 40200a
b loc 40200b
c loc 40200c
d loc 40200d
e loc 40200e
---------------
f loc 40200f
g loc 402010
h loc 402011
i loc 402012
j loc 402013
! loc 402014
@ loc 402015
# loc 402016
$ loc 402017
% loc 402018
Process returned 0 (0x0) execution time : 0.730 s
Press any key to continue.
可以看到,它们这几个数组的区域是相邻的,并且调用strcpy()函数用b对a赋值,可以看到会覆盖在和a相邻的数组。
strcpy()函数使用的是‘\0’进行结束判断,一般的实现为
char *strcpy(char *strDest, const char *strSrc)
{
if ( strDest == NULL || strSrc == NULL)
return NULL ;
if ( strDest == strSrc)
return strDest ;
char *tempptr = strDest ;
while( (*strDest++ = *strSrc++) != ‘\0’);
return tempptr ;
}
所以在没有’\0’符号的前提下会一直往下赋值,直到遇到内存里的某个’\0’(这个字符在内存里非常常见)。