当前位置:  技术问答>linux和unix

非常非常奇怪的结构体问题,希望老手

    来源: 互联网  发布时间:2016-04-03

    本文导语:  某一嵌入式Liunx平台下定义如下结构体会出现程序跳出: class CBitmap { void LoadBitmap();//导入图片时要分配较大的内存空间 }; typedef struct MyStruct{     long la;     long lb;     long lc;     CBitmap bpA; // 将对象放...

某一嵌入式Liunx平台下定义如下结构体会出现程序跳出:
class CBitmap
{
void LoadBitmap();//导入图片时要分配较大的内存空间
};

typedef struct MyStruct{
    long la;
    long lb;
    long lc;
    CBitmap bpA; // 将对象放在结构体的后面定义,程序在调用bbA.LoadBitmap时,跳出程序
    CBitmap bpB; // 将对象放在结构体的后面定义,程序在调用bbA.LoadBitmap时,跳出程序
};

如果将对象调到结构体的上部分,程序运行正常
typedef struct MyStruct{
    CBitmap bpA; // OK
    CBitmap bpB; // OK
    long la;
    long lb;
    long lc;   
};

在Win32平台和Linux PC平台也是OK的,而在嵌入式设备上就出现了跳出程序的问题。

如何解释这个现象?
上面的结构体是否有些不够规范,有哪些好的规范建议?
谢谢大家支持。
  

|


一:typedef struct MyStruct{
long la;
long lb;
long lc;
CBitmap bpA; // 将对象放在结构体的后面定义,程序在调用bbA.LoadBitmap时,跳出程序
CBitmap bpB; // 将对象放在结构体的后面定义,程序在调用bbA.LoadBitmap时,跳出程序
};
typedef的意思是什么?你那里为什么是空的?

二:
typedef struct MyStruct{
long la;
long lb;
long lc;
CBitmap bpA; // 将对象放在结构体的后面定义,程序在调用bbA.LoadBitmap时,跳出程序
CBitmap bpB; // 将对象放在结构体的后面定义,程序在调用bbA.LoadBitmap时,跳出程序
};
一般都是定义类的指针,需要时new

三:跳出程序是什么意思?

|
MyStruct的对象如果在栈里创建,当MyStruct本身很大时,会占用太多的线程栈空间,win32下默认线程栈是1MB,嵌入式设备上栈会小得多,因此会出现在windows里可以用,在嵌入式设备上失败的情况。
CBitmap成员可能本身有很多或者很大的成员变量,造成MyStruct对象过于庞大,内存栈溢出。

至于为什么变变位置就可以了,应该是结构体的字节对齐问题。

|
栈溢出很难碰到。如果是我遇到这种情况, 肯定会认为是内存越界写引起的。 很多工具可以帮助找出问题, 我一般用efence.

|
跳出程序,程序异常终止。一般是访问了非法内存地址

|
结构体的字节对齐问题。。

|
会不会与class CBitmap是个空对象有关系,在class CBitmap 里面定义一个成员变量看看 

|
class CBitmap
{
void LoadBitmap();//导入图片时要分配较大的内存空间
};

typedef struct MyStruct{
    long la;
    long lb;
    long lc;
    CBitmap *bpA; // 将对象放在结构体的后面定义,程序在调用bbA.LoadBitmap时,跳出程序
    CBitmap *bpB; // 将对象放在结构体的后面定义,程序在调用bbA.LoadBitmap时,跳出程序
}; 

|
我也认为是字节不对其的问题。。。嵌入式设备的CPU像ARM什么的,如果内存地址不对齐,程序直接就完蛋了。

|
结构内部会自动做alignment, 不可能因为结构定义出现字节不对齐的情况。

另外, 我发现一个很有意思的情况。 程序出了问题,大家通常都很倾向于找系统的问题, 或者很异常的case。 如果问题95%可能是由于case 1导致, 另5%可能是由case 2导致, 一半以上的人都会认为是因为case 2引起的。

也可能是因为小概率事件或者传说中的小概率事件给人印象深刻的缘故。 :)

|

呵呵,我也有同感。
估计每个人都觉得自己碰到的问题是很难的小概率事件,95%的错误怎么可能我发现不了。

自己平时好像也有这毛病。哈哈

|
如果是字节对齐问题,可以试试强制一字节对齐,应该可以解决。

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 奇怪!奇怪!真奇怪!!!
  • 奇怪奇怪真奇怪
  • 奇怪,真奇怪,在线等待
  • shm_open函数问题.奇怪!!!奇怪!!!!!
  • 奇怪奇怪...........?????...........
  • solaris上的C程序,编译报错: 存储类只能使用register,奇怪,奇怪!
  • 奇怪!奇怪!我用jbuilder编jsp程序,从数据库中取出的字符串型字段却显示16进制数
  • 奇怪的问题 奇怪的问题,向大家请教
  • 奇怪啊,奇怪,为什么我的JB7做EJB时,只要在EJB设计面板上随便做点东西,我的EJB的JAVA的源码就会变的不见了,或者少了很多字段申明??
  • 奇怪,CSDN的贴子,提问部分我最多能看到第4行??!!
  • accept,recvfrom接收到奇怪的ip
  • 好奇怪的问题哎………………怎么也不能安装!
  • 一个特奇怪的函数申明错误
  • unix下的非常的奇怪WC的问题,向unix高手请教 好急呀!!!!!!!!!!!!!!!
  • 奇怪!关于字串参数的问题?
  • 一个奇怪的路径问题
  • 一些奇怪的现象,帮帮我
  • !!!初学Java,遇到一个奇怪问题,请大家回答!!!
  • SOCKET发送奇怪问题!!!
  • 奇怪的四分之一屏!!


  • 站内导航:


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

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

    浙ICP备11055608号-3