当前位置:  技术问答>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字节对齐。

期待你的解答!

|
不知道楼主用的是什么操作系统?
看到那些值是在程序的输出中还是调试器里?
如果是在调试器里, 可能是调试器把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位 而且后面的把前面的值都显示出来了。


|
请问你的这些输出值怎么来的?

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?

|

完全同意你的分析

    
 
 

您可能感兴趣的文章:

  • unix下内存边界对齐问题!
  • unix下,如何使得结构按1字节进行内存对齐?
  • struct 结构内存对齐问题.
  • 内存对齐的问题,会的请进
  • 教你5分钟轻松搞定内存字节对齐
  • 求助:unix下内存对齐问题的解决
  • VC++中内存对齐实例教程
  • 浅析内存对齐与ANSI C中struct型数据的内存布局
  • 深入内存对齐的详解
  • 深入理解c/c++ 内存对齐
  • C语言内存对齐实例详解
  • C语言、C++内存对齐问题详解
  • 关于C++内存中字节对齐问题的详细介绍
  • 深入理解C语言内存对齐
  • 解析内存对齐 Data alignment: Straighten up and fly right的详解
  • c/c++服务器程序内存泄露问题分析及解决
  • Linux内存文件系统(ramdisk)的三种实现方式 iis7站长之家
  • 请教一个关于内存分配的问题(系统和DMA共享一块物理内存空间)
  • [跪求解答]关于虚拟内存中页目录与页表在物理内存中加载的问题
  • 遇到奇怪的内存泄露问题,应用程序杀死内存无法释放!
  • 请教关于linux内存管理问题,如何给定义的变量指定固定内存段
  • 【求助】AIX下进程内存分配问题,无法分配超过256M的内存
  • Solaris上内存释放问题
  • vsftpd占用内存的问题
  • linux虚拟内存的问题!急!!!
  • 请教几个虚拟内存的问题!谢谢
  • 有关系统内存的概念问题
  • 共享内存问题,高手们请进!!!
  • ubuntu的问题。查看内存使用情况的问题
  • dos内存问题,请帮助
  • 问个LINUX内存分配的问题。
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • C++ Vectors 成员 get_allocator():返回vector的内存分配器
  • 我的机器内存128 ,安装redhat9 后,可用内存很少了,如何节省内存呢?
  • C++ Vectors 成员 capacity():返回vector所能容纳的元素数量(在不重新分配内存的情况下)
  • 奇闻:Apache+Apache JServ 1.1.1+1G内存居然报内存不够,那位高友知道参数设置,把俺的1G内存都利用起来,感激不尽啊
  • tcmalloc内存泄露优化c++开源库下载,安装及使用介绍
  • 怎样读取指定内存地址处指定长度的内存数据???(
  • C/C++内存池实现介绍及基本要求
  • 【操作系统虚拟内存和物理内存疑惑】
  • linux下free命令显示的内存使用情况分析
  • Solaris下如何获得物理内存和虚拟内存的大小?
  • c/c++内存堆分配和栈分配理解
  • 程序需要共享内存相当大,但是系统的内存有限
  • Ubuntu查看内存,进程相关命令介绍
  • 关于大于2G内存的使用.....按32位编译的进程怎么使用大于2G的内存?
  • Linux 共享内存介绍及实现代码
  • redhat9内存使用率高达73%,怎么查看内存具体使用情况
  • Linux内存文件系统(ramdisk)的三种实现方式
  • 多个进程对系统V共享内存进行读写,怎样实现对共享内存部分进行加解锁?
  • Microsoft IE MSHTML内存破坏远程代码执行漏洞
  • redhat7.1 p4,700多m内存,经常耗了400m内存,为什么?
  • Microsoft Internet Explorer内存破坏漏洞(CNVD-2013-13096)
  • 哪位前辈给解释下linux下虚拟内存和物理内存的关系!


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3