当前位置: 技术问答>linux和unix
内存对齐的问题
来源: 互联网 发布时间:2016-03-08
本文导语: 结构体: typedef struct _t { //U32 : unsigned int U32 t1; U32 t2; U32 t3; U32 t4; U32 t5; U32 t6; } T_Type; T_Type test; //赋值 test.t1 = 0x0000000A; test.t2 = 0x000001F4; test.t3 = 0x00000FA0; test.t4 =...
结构体:
typedef struct _t {
//U32 : unsigned int
U32 t1;
U32 t2;
U32 t3;
U32 t4;
U32 t5;
U32 t6;
} T_Type;
T_Type test;
//赋值
test.t1 = 0x0000000A;
test.t2 = 0x000001F4;
test.t3 = 0x00000FA0;
test.t4 = 0x00001388;
test.t5 = 0x00007D00;
test.t6 = 0x0036EE80;
//调用函数func(T_Type *p_test);
func(&test);
问题:调用上面的函数后发现
p_test->t1 == 0x000001F40000000A; //对照实参的t1,t2
p_test->t2 == 0x0000138800000FA0;
p_test->t3 == 0x0036EE8000007D00;
p_test->t4 == 0x4e54168512224878;
p_test->t5 == 0x2E32393100000000;
p_test->t6 == 0x34322E302E383631;
========================================
不明白为什么会这样,何解?
编译器用的是CCstudio ,另外我检查过内存的对齐为4字节对齐。
期待你的解答!
typedef struct _t {
//U32 : unsigned int
U32 t1;
U32 t2;
U32 t3;
U32 t4;
U32 t5;
U32 t6;
} T_Type;
T_Type test;
//赋值
test.t1 = 0x0000000A;
test.t2 = 0x000001F4;
test.t3 = 0x00000FA0;
test.t4 = 0x00001388;
test.t5 = 0x00007D00;
test.t6 = 0x0036EE80;
//调用函数func(T_Type *p_test);
func(&test);
问题:调用上面的函数后发现
p_test->t1 == 0x000001F40000000A; //对照实参的t1,t2
p_test->t2 == 0x0000138800000FA0;
p_test->t3 == 0x0036EE8000007D00;
p_test->t4 == 0x4e54168512224878;
p_test->t5 == 0x2E32393100000000;
p_test->t6 == 0x34322E302E383631;
========================================
不明白为什么会这样,何解?
编译器用的是CCstudio ,另外我检查过内存的对齐为4字节对齐。
期待你的解答!
|
不知道楼主用的是什么操作系统?
看到那些值是在程序的输出中还是调试器里?
如果是在调试器里, 可能是调试器把p_test->t1当成64位来显示了.
在AMD64上输出为:
p_test->t1 = 0x000000000000000a
p_test->t1 = 0x000001f40000000a
看到那些值是在程序的输出中还是调试器里?
如果是在调试器里, 可能是调试器把p_test->t1当成64位来显示了.
#include
#include
typedef uint32_t U32;
// ½á¹¹Ì壺
typedef struct _t {
//U32 : unsigned int
U32 t1;
U32 t2;
U32 t3;
U32 t4;
U32 t5;
U32 t6;
} T_Type;
void func(T_Type *p_test);
int
main(void)
{
T_Type test;
//¸³Öµ
test.t1 = 0x0000000A;
test.t2 = 0x000001F4;
test.t3 = 0x00000FA0;
test.t4 = 0x00001388;
test.t5 = 0x00007D00;
test.t6 = 0x0036EE80;
//µ÷Óú¯Êýfunc(T_Type *p_test);
func(&test);
}
void
func(T_Type *p_test)
{
printf("p_test->t1 = 0x%016xn", p_test->t1);
printf("p_test->t1 = 0x%016llxn", *((uint64_t * )&p_test->t1));
}
在AMD64上输出为:
p_test->t1 = 0x000000000000000a
p_test->t1 = 0x000001f40000000a
|
同意楼上的
这和内存对齐没关系。
和大端小端更没有任何关系。
肯定是调试器的理解不对
观察一下这些值
全都是64位 而且后面的把前面的值都显示出来了。
这和内存对齐没关系。
和大端小端更没有任何关系。
肯定是调试器的理解不对
观察一下这些值
全都是64位 而且后面的把前面的值都显示出来了。
|
请问你的这些输出值怎么来的?
p_test-> t1 == 0x000001F40000000A; //对照实参的t1,t2
p_test-> t2 == 0x0000138800000FA0;
p_test-> t3 == 0x0036EE8000007D00;
p_test-> t4 == 0x4e54168512224878;
p_test-> t5 == 0x2E32393100000000;
p_test-> t6 == 0x34322E302E383631;
你明明用的U32,4个bytes, 可是这些输出都是8byte?
p_test-> t1 == 0x000001F40000000A; //对照实参的t1,t2
p_test-> t2 == 0x0000138800000FA0;
p_test-> t3 == 0x0036EE8000007D00;
p_test-> t4 == 0x4e54168512224878;
p_test-> t5 == 0x2E32393100000000;
p_test-> t6 == 0x34322E302E383631;
你明明用的U32,4个bytes, 可是这些输出都是8byte?
|
完全同意你的分析