有点急,感到很奇怪---》一个结构体赋值的简单问题《---问题解决就结贴

时间:2021-03-13 19:00:32
我定义了一个结构体
typedef struct
{
SOCKET sServerSocket;
SOCKET *psClientSocket;
SOCKADDR_IN *pServerAddr;
SOCKADDR_IN *pClientAddr;
BOOL *pbConnected;
unsigned char *pucBuffer;
int *pnMessageLen;

}EXCHANGE_INFO;

这是一个对话框应用程序
在对话框类中定义了一个变量: 
  EXCHANGE_INFO m_MyServer;

在对话框类的OnInitDialog()中写入了以下代码:
if(WSAStartup(0x0202,&wsd)!=0)
{
AfxMessageBox("WSAStartup() failed!");
return false;
}

memset(&m_MyServer,0,sizeof(EXCHANGE_INFO));

m_MyServer.sServerSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(m_MyServer.sServerSocket==SOCKET_ERROR)
{
AfxMessageBox("socket() failed!");
return false;
}

       *m_MyServer.pbConnected=false;  //这一句引发了一个错误:该地址不能写

我是想对这个结构体变量赋初值,但是象我上面那样(*m_MyServer.pbConnected=false;)就会出错,感到很奇怪,除了成员sServerSocket其他的结构体成员也是这样,他们的区别是sServerSocket没加*、其他的都加了*

一个结构体变量应怎样对其成员逐个赋初值???
望各位高手指点!!!!
先谢谢了!!在线等!!!

16 个解决方案

#1


*m_MyServer.pbConnected 前面为什么要加*
你应该把一个指向bool形的指针赋给m_MyServer.pbConnected

#2


注意运算符优先级

#3


当你用memset时,把pbConnected置为0,也就是地址是0
*m_MyServer.pbConnected=false;  是向地址是0的地方写,当然不可以了。

#4


说错了:(

#5


定义的结构就不合理

#6


BOOL *pbConnected; 有点不明白你为什么要把它定义成指针。

#7


我现在试试各位的意见!!!

#8


因为结构体定义的带*的都是指针变量
要么给让这些指针指向已经分配的地址的其他变量,要么给这些指针分配空间
你这里应该这么用
BOOL bConnect = FALSE;
m_MyServer.pbConnected = &bConnect 
或者:
m_MyServer.pbConnected = new BOOL;
*m_MyServer.pbConnected = FALSE;

#9


EXCHANGE_INFO m_MyServer;
應該為EXCHANGE_INFO* m_pMyServer;

怎麼沒看到你分配內存亞.

#10


我的这个结构体变量是要在线程间传递的,大家认为应该怎样定义?

#11


BOOL *pbConnected; //为什么用 pointer?

一个 BOOL 在win2k下是   sizeof(BOOO) = 4.
一个 pointer 在win2k下是 sizeof() = 4

空间是一样的。

建议不要使用pointer。赋值不是很方便。
如果一定要这么使用的话,

m_MyServer.pbConnected = &false;
//你只分配了指针变量的空间,没有分配指向指针地址的空间



BOOL bConnected:


#12


To:beyondtkl(大龙驹宣言:抵制日货,从我做起)
   EXCHANGE_INFO m_MyServer;和 EXCHANGE_INFO* m_pMyServer;效果一样

我是把MyServer当成多个线程函数的参数,以便线程通信,大家认为定义成EXCHANGE_INFO m_MyServer;还是 EXCHANGE_INFO* m_pMyServer;


#13


对楼上的细化一下:
BOOL aaa=false;
m_MyServer.pbConnected=&aaa; 
呵呵,就这么简单

#14


刚才的话其实是针对第一个答案说的,没想到发出去一刷新,有这么多人回答了,呵呵

#15


我想楼主没有搞清楚指针与一般数据类型的区别,指针的数据区存放的是变量的地址,你的赋值显示违反了这一原则,楼上的兄弟写的也有问题,false是个常量,这样赋值,是隐式的生成了一个临时变量,然后,pbConnected指向这个临时变量的地址,而这个临时变量在执行完一条语句后马上就被删除,所以pbconnected指向的是一个没有用的地址。
要想楼主这样定义能使用,那么必须先分配内存空间,让这些指针指向新分配的内存空间,例如:
 m_MyServer.pbConnected = new bool; 
*m_MyServer.pbConnected=false;
这样就可能使用了。 
其它指针项也类似操作

#16


谢谢大家的参与,让我想一下,听大家这么一说,觉得自己的VC知识太少了!^_^

#1


*m_MyServer.pbConnected 前面为什么要加*
你应该把一个指向bool形的指针赋给m_MyServer.pbConnected

#2


注意运算符优先级

#3


当你用memset时,把pbConnected置为0,也就是地址是0
*m_MyServer.pbConnected=false;  是向地址是0的地方写,当然不可以了。

#4


说错了:(

#5


定义的结构就不合理

#6


BOOL *pbConnected; 有点不明白你为什么要把它定义成指针。

#7


我现在试试各位的意见!!!

#8


因为结构体定义的带*的都是指针变量
要么给让这些指针指向已经分配的地址的其他变量,要么给这些指针分配空间
你这里应该这么用
BOOL bConnect = FALSE;
m_MyServer.pbConnected = &bConnect 
或者:
m_MyServer.pbConnected = new BOOL;
*m_MyServer.pbConnected = FALSE;

#9


EXCHANGE_INFO m_MyServer;
應該為EXCHANGE_INFO* m_pMyServer;

怎麼沒看到你分配內存亞.

#10


我的这个结构体变量是要在线程间传递的,大家认为应该怎样定义?

#11


BOOL *pbConnected; //为什么用 pointer?

一个 BOOL 在win2k下是   sizeof(BOOO) = 4.
一个 pointer 在win2k下是 sizeof() = 4

空间是一样的。

建议不要使用pointer。赋值不是很方便。
如果一定要这么使用的话,

m_MyServer.pbConnected = &false;
//你只分配了指针变量的空间,没有分配指向指针地址的空间



BOOL bConnected:


#12


To:beyondtkl(大龙驹宣言:抵制日货,从我做起)
   EXCHANGE_INFO m_MyServer;和 EXCHANGE_INFO* m_pMyServer;效果一样

我是把MyServer当成多个线程函数的参数,以便线程通信,大家认为定义成EXCHANGE_INFO m_MyServer;还是 EXCHANGE_INFO* m_pMyServer;


#13


对楼上的细化一下:
BOOL aaa=false;
m_MyServer.pbConnected=&aaa; 
呵呵,就这么简单

#14


刚才的话其实是针对第一个答案说的,没想到发出去一刷新,有这么多人回答了,呵呵

#15


我想楼主没有搞清楚指针与一般数据类型的区别,指针的数据区存放的是变量的地址,你的赋值显示违反了这一原则,楼上的兄弟写的也有问题,false是个常量,这样赋值,是隐式的生成了一个临时变量,然后,pbConnected指向这个临时变量的地址,而这个临时变量在执行完一条语句后马上就被删除,所以pbconnected指向的是一个没有用的地址。
要想楼主这样定义能使用,那么必须先分配内存空间,让这些指针指向新分配的内存空间,例如:
 m_MyServer.pbConnected = new bool; 
*m_MyServer.pbConnected=false;
这样就可能使用了。 
其它指针项也类似操作

#16


谢谢大家的参与,让我想一下,听大家这么一说,觉得自己的VC知识太少了!^_^