为什么在指针赋值后会出现分段错误?

时间:2012-03-05 08:54:56

标签: c pointers segmentation-fault

在指针赋值后立即调用函数时出现了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,它可以正常工作。 是因为两个指针的大小不同吗?

感谢。

3 个答案:

答案 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)

MSG1MSG是不同的类型。

pMsg1指向Msg,其类型为MSG,但其类型为MSG1*

尝试访问MSG1中的字段时,在MSG所在的内存区域中,您会得到未定义的行为。

答案 2 :(得分:0)

如果结构不相同,则不要通过分配

进行复制
 pMsg1 = (MSG1 *)&Msg;

复制结构中的各个元素。然后它解决了你的问题。