关于C对变量地址的处理(原创)
心中一直对c语言对变量地址的处理有一些疑问,比如对于多字节变量,变量地址是指向高字节还是低字节,与大小端是否有关等等。今天测试了一下,心中的石头落地。
测试环境Keil uVision3, C-FREE4.0
之所以选择这两个环境是因为Keil uVision3将51单片机配置为大端,
C-FREE 针对X86,是小端。
测试代码
int main(void)
{
long int i = 1; //定义4字节长度的整形变量
short int si = 1; //定义2字节长度的整形变量
char c = 'e'; //定义1字节长度的字符形变量
long int* pi = &i; //指向4字节长度的整形变量的指针变量
short int* psi = &si; //指向2字节长度的整形变量的指针变量
char* pc = &c; //指向1字节长度的整形变量的指针变量
char* pi2c = (char*)&i; //将指向4字节长度的整形变量的指针强制
//转为
指向1字节长度的字符形变量的指针
return 0;
}
1、Keil uVision3测试结果
下图为变量的地址
下图为内存数据
可以看出51单片机的栈是向上生长的,内存分配情况如下依次为i,si,c
0~7被工作寄存器占用,从8开始才被程序使用
内存地址 | 0x08 | 0x09 | 0x0a | 0x0b |
值 | 00 | 00 | 00 | 01 |
内存地址 | 0x0c | 0x0d |
值 | 00 | 01 |
内存地址 | 0x0e |
值 | 65 |
可以清楚地看出
*51的多字节变量的低字节放在高内存地址,为大端
*变量的指针为低内存地址,这个可要注意了,当将4字节变量的指
针强制转换为单字节变量的指针再取变量时,取得的并不是原数据低
位,而是高位!
2、C-FREE的测试结果
下图为变量的地址
下图为内存数据
可以看出X86的栈是向下生长的,内存分配情况如下,依次为 i,si,c
内存地址 | 0x240ff5c | 0x240ff5d | 0x240ff5e | 0x240ff5f |
值 | 01 | 00 | 00 | 00 |
内存地址 | 0x240ff5a | 0x240ff5b |
值 | 01 | 00 |
内存地址 | 0x240ff59 |
值 | 65 |
可以清楚地看出
*X86的多字节变量的低字节放在低内存地址,为小端
*变量的指针为低内存地址
3、总结
通过以上此时,大概可以知道C语言对变量地址的处理了
*无论为大端、小端,变量的地址都为低内存地址。
所以做指针类型强制转换时要注意了。
意外的收获:清楚了编译器是如何依次为变量分配栈空间的。
附件:https://static.assets-stash.eet-china.com/album/old-resources/2010/4/24/d2aeb6f5-54e0-4f4d-a23a-2bd561b08c68.rar
用户377235 2012-12-4 19:44
不错