none
结构体的问题 RRS feed

  • 问题

  • 我在验证结构体在内存中的结构的时候,想深入了解在内存中的模型,定义了一个结构体:

    typedef struct MYMSG
    {
     CString str;
    }INFO, *LPINFO;//定义结构体别名和指针

    在按钮响应中向结构体赋值:

    void CTestDlg::OnBnClickedButton1()
    {
     // TODO: Add your control notification handler code here
     struct MYMSG mymsg;
     mymsg.str = "hello!";//赋值

     INFO info;
     CString str1 = info.str;//INFO是结构体的别名,  我发现不能访问mymsg.str = "hello!"
     AfxMessageBox(str1);

     LPINFO lpinfo = (LPINFO)GlobalAlloc(GPTR, sizeof(LPINFO));
     CString str2 = lpinfo->str;//同样不能访问mymsg.str = "hello!",还报错
     AfxMessageBox(str2);

     free(lpinfo);
    }

    我想知道怎样才能访问?


    xiao
    2011年1月21日 6:49

答案

  • C++从概念上分为了五个存储区,堆,栈,常量,全局/静态,和自由存储区。

    而lpinfo(自由存储区) ,mymsg(栈),info(栈)。分别是不同的对象,并不是引用或者指向同一个对象。所以这三个地址不同是正常的。如果要相互访问,你可以在全局声明一个extern MYMSG  gMsg。然后通过extern的方式进行访问。不过需要注意互斥。

     


    麻烦把正确答案设为解答。
    • 已标记为答案 wh_xiao 2011年1月26日 5:42
    2011年1月26日 1:51
    版主

全部回复

  • 你只学过C吗?

    void CTestDlg::OnBnClickedButton1()
    {
     // TODO: Add your control notification handler code here
     struct MYMSG mymsg;
    //虽然不是很确定,但是根据你下面说mymsg.str="hello!"不能执行,所以我认为你这么定义变量使得str没有被构造
     mymsg.str = "hello!";//赋值

     INFO info;
     CString str1 = info.str;//INFO是结构体的别名,  我发现不能访问mymsg.str = "hello!"
     AfxMessageBox(str1);

     LPINFO lpinfo = (LPINFO)GlobalAlloc(GPTR, sizeof(LPINFO));//INFO结构不是pod类型,不能类似这样内存拷贝的方式来用
     CString str2 = lpinfo->str;//同样不能访问mymsg.str = "hello!",还报错
     AfxMessageBox(str2);

     free(lpinfo);
    }


    2011年1月21日 14:31
  • typedef struct MYMSG
    {
     CString str;
    }INFO, *LPINFO;相当于:

    struct MYMSG
    {
     CString str;
    };和typedef struct MYMSG INFO;和结构体指针.

    这里的INFO相当于结构体的别名,我在测试的时候用

    struct MYMSG mymsg;
     mymsg.str = "hello!";//赋值

     INFO info;
     CString str1 = info.str;

     AfxMessageBox(str1);

    没有输出,这表明结构体和别名在内存中不是同一个区域.用下面的可以访问别名在内存中的区域:

    INFO info;
     CString str1;
     info.str = "hello!";
     AfxMessageBox(info.str);
     
     LPINFO lpinfo = &info;
     AfxMessageBox(lpinfo->str);

    用下面的可以访问结构体在内存中的区域:

    struct MYMSG *pmsg;
     pmsg = lpinfo;
     AfxMessageBox(pmsg->str);


    xiao
    2011年1月23日 2:11
  • Hi,

    请问你使用的是什么编译器?struct MYMSG虽然是个struct。但是在C++中,会被看作是一个class。区别在于一些访问限制。尽管你没有写构造函数。但是由于MYMSG有一个非bitwise语义的,所以编译器会为其自动生成默认的构造函数。我认为mymsg.str 作为一个左值是可以访问的。


    麻烦把正确答案设为解答。
    2011年1月24日 1:29
    版主
  • 用的是VS2010

    在多线程编程中经常要用到结构体,常见的用法是在头文件中定义:

    typedef struct MYMSG
    {
     CString str;
    }INFO, *LPINFO;

    在线程中用:LPINFO lpinfo = (LPINFO)GlobalAlloc(GPTR, sizeof(LPINFO));
    这是在堆中开一个内存区域,struct MYMSG  mymsg在内存中也有一个区域,INFO  info在内存中同样有一个内存区域,我发这三个区域在内存中的地址是不同的。

    我想知道怎样才能相互的访问?


    xiao
    2011年1月25日 11:12
  • C++从概念上分为了五个存储区,堆,栈,常量,全局/静态,和自由存储区。

    而lpinfo(自由存储区) ,mymsg(栈),info(栈)。分别是不同的对象,并不是引用或者指向同一个对象。所以这三个地址不同是正常的。如果要相互访问,你可以在全局声明一个extern MYMSG  gMsg。然后通过extern的方式进行访问。不过需要注意互斥。

     


    麻烦把正确答案设为解答。
    • 已标记为答案 wh_xiao 2011年1月26日 5:42
    2011年1月26日 1:51
    版主