/*
声明如果没有声明的话三个函数不变
在没有char cd[]="44523";这句话
程序头为
#include<stdio.h>
#include<stdlib.h>
char ga[]="abcdefghijklm";
时
结果如下
addr of global array=0X402000
addr of ga[0]=0X402000
addr of ga[1]=0X402001
14
addr of array param=0x22ff20
addr of ca[0]=0x402000
addr of ca[1]=0x402001
++ca=0X402001
addr of array param=0x22ff20
addr of ca[0]=0x402000
addr of ca[1]=0x402001
++ca=0X402001
1
请按任意键继续. . .
在加上char cd;后
程序头变为
#include<stdio.h>
#include<stdlib.h>
char cd;
char ga[]="abcdefghijklm";
结果
addr of global array=0X404010
addr of global array=0X402000
addr of ga[0]=0X402000
addr of ga[1]=0X402001
14
addr of array param=0x22ff20
addr of ca[0]=0x402000
addr of ca[1]=0x402001
++ca=0X402001
addr of array param=0x22ff20
addr of ca[0]=0x402000
addr of ca[1]=0x402001
++ca=0X402001
1
请按任意键继续. . .
在程序头为
#include<stdio.h>
#include<stdlib.h>
int cd;
char ga[]="abcdefghijklm";
结果是
addr of global array=0X404010
addr of global array=0X402000
addr of ga[0]=0X402000
addr of ga[1]=0X402001
14
addr of array param=0x22ff20
addr of ca[0]=0x402000
addr of ca[1]=0x402001
++ca=0X402001
addr of array param=0x22ff20
addr of ca[0]=0x402000
addr of ca[1]=0x402001
++ca=0X402001
1
请按任意键继续. . .
在加上 char cd[]="44523";后
程序头变为
#include<stdio.h>
#include<stdlib.h>
char cd[]="44523";
char ga[]="abcdefghijklm";
结果
addr of global array=0X402000
addr of global array=0X402006
addr of ga[0]=0X402006
addr of ga[1]=0X402007
14
addr of array param=0x22ff20
addr of ca[0]=0x402006
addr of ca[1]=0x402007
++ca=0X402007
addr of array param=0x22ff20
addr of ca[0]=0x402006
addr of ca[1]=0x402007
++ca=0X402007
1
请按任意键继续. . .
更改
char cd[]="44523";
char ga[]="abcdefghijklm";
两句的位置后
结果如下
addr of global array=0X40200E
addr of global array=0X402000
addr of ga[0]=0X402000
addr of ga[1]=0X402001
14
addr of array param=0x22ff20
addr of ca[0]=0x402000
addr of ca[1]=0x402001
++ca=0X402001
addr of array param=0x22ff20
addr of ca[0]=0x402000
addr of ca[1]=0x402001
++ca=0X402001
1
请按任意键继续. . .
基于以上可以得出
//应该说程序为变量分配内存会因数据类型不同而分在相应的区块里
//所以如果第一句为char cd;的话,不会影响到ga的值,因为ga是数组里的
//第一个量,它分配在了第一个位置上,仅此而已 。(这是徐悦竹老师讲的)
同时可以看到一个char型变量是占一个内存单元cd数组有5个元素,首元素为
0X402000,则第五个为0X402005,然后紧接着ga的首元素为0X402006
那么int呢
程序头变为
#include<stdio.h>
#include<stdlib.h>
int cd[]={4,4,5,2,3};
char ga[]="abcdefghijklm";
结果为
addr of global array=0X402000
addr of global array=0X402014
addr of ga[0]=0X402014
addr of ga[1]=0X402015
14
addr of array param=0x22ff20
addr of ca[0]=0x402014
addr of ca[1]=0x402015
++ca=0X402015
addr of array param=0x22ff20
addr of ca[0]=0x402014
addr of ca[1]=0x402015
++ca=0X402015
1
请按任意键继续. . .
这是个比较不一样的地方,int型是比char型大一倍,但是13不是5的倍数(cd有5个int元素)
猜测:int后应该会有个收尾的工作,占了3个字节
我再次把
int cd[]={4,4,5,2,3};
char ga[]="abcdefghijklm";
两句调换位置
此时程序头为
#include<stdio.h>
#include<stdlib.h>
char ga[]="abcdefghijklm";
int cd[]={4,4,5,2,3};
结果为
addr of global array=0X402010
addr of global array=0X402000
addr of ga[0]=0X402000
addr of ga[1]=0X402001
14
addr of array param=0x22ff20
addr of ca[0]=0x402000
addr of ca[1]=0x402001
++ca=0X402001
addr of array param=0x22ff20
addr of ca[0]=0x402000
addr of ca[1]=0x402001
++ca=0X402001
1
请按任意键继续. . .
可以看到在cd为char型数组变量的时候,系统在为ga分配完内存后直接给cd分配内存
addr of global array=0X40200E
addr of global array=0X402000 说明在ga的13个元素后直接给cd分配内存了
即(cd=ga尾元素+1)
而在cd为int型数组的时候,
addr of global array=0X402010
addr of global array=0X402000
又是空出了3个字节,
那么这3个字节作为收尾代价是确定了 。
观察在cd为一个int型的变量和char变量时候的结果
addr of global array=0X404010
addr of global array=0X402000
此时的cd不是数组的首元,而是一个int变量,结果同样是空出3个字节,说明编译器分配内存时在不同类型(char、 int 、char[]、 int[])之间会有空隙
我会好奇这3个字节是什么作用,或者存了些什么
此时程序头为
#include<stdio.h>
#include<stdlib.h>
char ga[]="abcdefghijklm";
int cd[]={4,4,5,2,3};
在main函数里打印cd地址的语句后加上
printf("addr of global array=%#X /n",*(cd+1));
结果为
addr of global array=0X402010
addr of global array=0X4
addr of global array=0X402000
addr of ga[0]=0X402000
addr of ga[1]=0X402001
14
addr of array param=0x22ff20
addr of ca[0]=0x402000
addr of ca[1]=0x402001
++ca=0X402001
addr of array param=0x22ff20
addr of ca[0]=0x402000
addr of ca[1]=0x402001
++ca=0X402001
1
请按任意键继续. . .
可以看出,cd+1就存了个地址块的名字,这个现象我想知道下原因,这3个字节干什么用了
我的猜测是它记录大内存的位置,因为那个addr of global array=0X4,这个数字是很大的
同时可以看出char型变量是一个字节,如果cd[]为int型的话,则cd的一个元素占4个字节,课本上记录的是int为16位两个字节,所以这里就不一样了。查阅资料后在《C++ Primer》中找到:实际应用中,大多数通用机器都是使用和long类型一样长的32位来表示int类型的。
*/