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
你应该把一个指向bool形的指针赋给m_MyServer.pbConnected
#2
注意运算符优先级
#3
当你用memset时,把pbConnected置为0,也就是地址是0
*m_MyServer.pbConnected=false; 是向地址是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;
要么给让这些指针指向已经分配的地址的其他变量,要么给这些指针分配空间
你这里应该这么用
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;
怎麼沒看到你分配內存亞.
應該為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:
一个 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;
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;
呵呵,就这么简单
BOOL aaa=false;
m_MyServer.pbConnected=&aaa;
呵呵,就这么简单
#14
刚才的话其实是针对第一个答案说的,没想到发出去一刷新,有这么多人回答了,呵呵
#15
我想楼主没有搞清楚指针与一般数据类型的区别,指针的数据区存放的是变量的地址,你的赋值显示违反了这一原则,楼上的兄弟写的也有问题,false是个常量,这样赋值,是隐式的生成了一个临时变量,然后,pbConnected指向这个临时变量的地址,而这个临时变量在执行完一条语句后马上就被删除,所以pbconnected指向的是一个没有用的地址。
要想楼主这样定义能使用,那么必须先分配内存空间,让这些指针指向新分配的内存空间,例如:
m_MyServer.pbConnected = new bool;
*m_MyServer.pbConnected=false;
这样就可能使用了。
其它指针项也类似操作
要想楼主这样定义能使用,那么必须先分配内存空间,让这些指针指向新分配的内存空间,例如:
m_MyServer.pbConnected = new bool;
*m_MyServer.pbConnected=false;
这样就可能使用了。
其它指针项也类似操作
#16
谢谢大家的参与,让我想一下,听大家这么一说,觉得自己的VC知识太少了!^_^
#1
*m_MyServer.pbConnected 前面为什么要加*
你应该把一个指向bool形的指针赋给m_MyServer.pbConnected
你应该把一个指向bool形的指针赋给m_MyServer.pbConnected
#2
注意运算符优先级
#3
当你用memset时,把pbConnected置为0,也就是地址是0
*m_MyServer.pbConnected=false; 是向地址是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;
要么给让这些指针指向已经分配的地址的其他变量,要么给这些指针分配空间
你这里应该这么用
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;
怎麼沒看到你分配內存亞.
應該為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:
一个 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;
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;
呵呵,就这么简单
BOOL aaa=false;
m_MyServer.pbConnected=&aaa;
呵呵,就这么简单
#14
刚才的话其实是针对第一个答案说的,没想到发出去一刷新,有这么多人回答了,呵呵
#15
我想楼主没有搞清楚指针与一般数据类型的区别,指针的数据区存放的是变量的地址,你的赋值显示违反了这一原则,楼上的兄弟写的也有问题,false是个常量,这样赋值,是隐式的生成了一个临时变量,然后,pbConnected指向这个临时变量的地址,而这个临时变量在执行完一条语句后马上就被删除,所以pbconnected指向的是一个没有用的地址。
要想楼主这样定义能使用,那么必须先分配内存空间,让这些指针指向新分配的内存空间,例如:
m_MyServer.pbConnected = new bool;
*m_MyServer.pbConnected=false;
这样就可能使用了。
其它指针项也类似操作
要想楼主这样定义能使用,那么必须先分配内存空间,让这些指针指向新分配的内存空间,例如:
m_MyServer.pbConnected = new bool;
*m_MyServer.pbConnected=false;
这样就可能使用了。
其它指针项也类似操作
#16
谢谢大家的参与,让我想一下,听大家这么一说,觉得自己的VC知识太少了!^_^