C#指针未解决问题

本文通过C# unsafe代码示例,探讨了不同数据类型在内存中的布局方式,展示了堆栈内存分配规律,并对比了指针变量与普通变量的内存占用情况。
考虑以下代码:
C# code
<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --> unsafe { byte b = 3; double d = 10.0; int i = 5; byte* pb = &b; double* pd = &d; int* pi = &i; Console.WriteLine("Address of b is 0x{0:X},size is {1},value is {2}", (uint)pb, sizeof(byte), b); Console.WriteLine("Address of d is 0x{0:X},size is {1},value is {2}", (uint)pd, sizeof(double), d); Console.WriteLine("Address of i is 0x{0:X},size is {1},value is {2}", (uint)pi, sizeof(int), i); Console.WriteLine("Address of pb is 0x{0:X},size is {1},value is 0x{2:X}", (uint)&pb, sizeof(byte*), (uint)pb); Console.WriteLine("Address of pd is 0x{0:X},size is {1},value is 0x{2:X}", (uint)&pd, sizeof(double*), (uint)pd); Console.WriteLine("Address of pi is 0x{0:X},size is {1},value is 0x{2:X}", (uint)&pi, sizeof(int*), (uint)pi); }

在我机子上显示的输出结果是
Addressofbis0x12F46C,sizeis1,valueis3
Addressofdis0x12F464,sizeis8,valueis10
Addressofiis0x12F460,sizeis4,valueis5
Addressofpbis0x12F45C,sizeis4,valueis0x12F46C
Addressofpdis0x12F458,sizeis4,valueis0x12F464
Addressofpiis0x12F454,sizeis4,valueis0x12F460

现在我的问题是:看代码,堆栈应该是从高地址向低地址向下填充,byte只占1个字节,而32位处理器系统堆栈的内存块总是按照4字节的倍数进行分配的。b的地址是0x12F46C,那么b这个值应该存储在0x12F468~0x12F46B中,占4个字节,然后为d分配内存,double类型占8个个字节,其地址应该是0x12F468,d应该存储在0x12F460~0x12F467中,但为什么输出结果b占了8个字节的内存而d却只占了4个字节的内存呢。
另外如果把代码的最后三行去掉,即变成
C# code
<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --> unsafe { byte b = 3; double d = 10.0; int i = 5; byte* pb = &b; double* pd = &d; int* pi = &i; Console.WriteLine("Address of b is 0x{0:X},size is {1},value is {2}", (uint)pb, sizeof(byte), b); Console.WriteLine("Address of d is 0x{0:X},size is {1},value is {2}", (uint)pd, sizeof(double), d); Console.WriteLine("Address of i is 0x{0:X},size is {1},value is {2}", (uint)pi, sizeof(int), i); }

输出结果为
Addressofbis0x12F45C,sizeis1,valueis3
Addressofdis0x12F460,sizeis8,valueis10
Addressofiis0x12F468,sizeis4,valueis5
内存分配变成了从低地址到高地址向上填充,但此时b占了4个字节,d占了8个字节,何解?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值