在指针赋值后立即调用函数时出现了segementation错误。
typedef struct
{
DMINT field1;
DMINT field2;
DMINT field3;
} MSG1;
typedef struct
{
....
} MSG;
/* MSG is size of 1040 byte, bigger than MSG1 in size */
int main()
{
MSG Msg;
MSG1 *pMsg1;
int mid;
pthread_t tid;
...
Recv_msg( mid, &Msg); /* this function does a memcpy to &Msg */
pMsg1 = (MSG1 *)&Msg;
//ret = pthread_join(pMsg1->..... ); /* Got Segmentation fault here by GDB*/
/* even the first argument has nothing to do with pMsg1, SEGV is still received */
ret = pthread_creat(&tid, NULL, thread_function, NULL); /* Got Segmentation fault here by GDB*/
如果删除pMsg1 = (MSG1 *)&Msg
,它可以正常工作。
是因为两个指针的大小不同吗?
感谢。
答案 0 :(得分:2)
只有当一个结构位于另一个结构的开头时,您才能安全地将一个结构指针转换为另一个结构(无论它们的大小如何,请参阅C std。):
typedef struct {
int a;
} S1;
typedef struct {
S1 s1; // <- s1 it the FIRST structure field
int b;
} S2;
S2 s2;
S1 *s1;
s1= (S1*)&s2; // <- safe
否则你可能会对齐问题和未定义的行为。
答案 1 :(得分:0)
MSG1
和MSG
是不同的类型。
pMsg1
指向Msg
,其类型为MSG
,但其类型为MSG1*
。
尝试访问MSG1
中的字段时,在MSG
所在的内存区域中,您会得到未定义的行为。
答案 2 :(得分:0)
如果结构不相同,则不要通过分配
进行复制 pMsg1 = (MSG1 *)&Msg;
复制结构中的各个元素。然后它解决了你的问题。