真奇怪了,结构体里不能带结构体吗?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了真奇怪了,结构体里不能带结构体吗?相关的知识,希望对你有一定的参考价值。
我的一段程序:
#include "common/initsock.h"
#include <stdio.h>
CInitSock initSock;
#define MSGLOGIN 1001 // 用户登录命令
#define MSGTRANSFER 1002 // 传输数据命令
#define MSGLOGOUT 1003 // 关闭连接命令
typedef struct _SMSPACK
DWORD MessageType; //消息类型,0:默认文本短消息类型
SHORT FunctionNo ; //功能号,0:登录 1:传输数据 2:终止连接
typedef struct _LOGINFO
char userName[20];
char UserPass[20];
Loginfo;
INT DataLength ; //业务数据报体长度
SMSPACK, *LPSMSPACK;
int main()
SMSPACK mypack;
mypack.Loginfo.userName=0; //出错
return 0;
如上,只要一给mypack里的结构体Loginfo成员赋值就会出错,提示
error C2274: 'function-style cast' : illegal as right side of '.' operator
error C2228: left of '.userName' must have class/struct/union type
那userName左边的Loginfo不就是一个struct吗,这不是睁眼说瞎话吗,就是不放我过,这错误提示的莫名其妙,我看别人用结构体里嵌套结构体完全正常,我这里倒底是怎么回事呢?请教高手解答
(1)
typedef struct _SMSPACK
DWORD MessageType;
SHORT FunctionNo ;
struct _LOGINFO // 【去掉前面的typedef】 不然Loginfo是一种在域_SMSPACK里面可见的结构类型,而不是成员变量,所以你在引用一个根本就不存在的成员时出错,相信你也在使用的时候智能提示里面没有Loginfo这个成员,呵呵
char userName[20];
char UserPass[20];
Loginfo;
INT DataLength ;
SMSPACK, *LPSMSPACK;
(2)在使用的时候赋值方法不恰当
int main()
SMSPACK mypack;
//mypack.Loginfo.userName=0;//出错,你要知道【userName是一个字符数组】,当然不能这么赋值,而且楼上的兄弟也说得对,你的写法是初始化方式。
mypack.Loginfo.userName[0] = '0'; //记得是字符数组,你只能一个一个地赋值(如我写给你的代码),使用起来很不方便。建议你用string类型。
return 0;
不明白的地方可以hi我 参考技术A 结构体能含结构体。 参考技术B 应该不可以嵌套定义吧,可以嵌套声明而已 参考技术C 0只能用来初始化,不能用来赋值。
C语言可以在一个链表里保存两个结构体吗
在对结构体的变量进行赋值的时候~~这两个结构体可以分开赋值、
参考技术A 当然可以拉typedef
struct
ST1
ST1_T;
typedef
struct
ST2
ST2_T;
typedef
union
ST1_T
st1;
ST2_T
st2;
ST;
然后将ST作为
链表
的基本数据类型就是了
如果是同时存储的话,那么:
typedef
struct
ST1_T
st1;
ST2_T
st2;
ST; 参考技术B 链表是结点的有机(有序或无序)连接,这些结点的类型一般为构造数据类型。如果两条链表需要比较、合并等运算,那么这两条链表的结点类型一定是相同的,由此可见,一个结构体应该可以构造多条链表。
以上是关于真奇怪了,结构体里不能带结构体吗?的主要内容,如果未能解决你的问题,请参考以下文章