当前位置: 技术问答>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的,而在嵌入式设备上就出现了跳出程序的问题。
如何解释这个现象?
上面的结构体是否有些不够规范,有哪些好的规范建议?
谢谢大家支持。
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对象过于庞大,内存栈溢出。
至于为什么变变位置就可以了,应该是结构体的字节对齐问题。
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时,跳出程序
};
{
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引起的。
也可能是因为小概率事件或者传说中的小概率事件给人印象深刻的缘故。 :)
另外, 我发现一个很有意思的情况。 程序出了问题,大家通常都很倾向于找系统的问题, 或者很异常的case。 如果问题95%可能是由于case 1导致, 另5%可能是由case 2导致, 一半以上的人都会认为是因为case 2引起的。
也可能是因为小概率事件或者传说中的小概率事件给人印象深刻的缘故。 :)
|
呵呵,我也有同感。
估计每个人都觉得自己碰到的问题是很难的小概率事件,95%的错误怎么可能我发现不了。
自己平时好像也有这毛病。哈哈
|
如果是字节对齐问题,可以试试强制一字节对齐,应该可以解决。