我正在尝试访问结构内部的结构指针数组中的结构成员的值。因此,我有一个结构Room,其中包含指向名为RoomboundConnection []的其他Room的指针数组。我不断收到错误
错误:请求成员“名称”的不是结构或联合 printf(“ Connection%i:%s”,i,x.outboundConnections [i] .name);
我的结构是这样设置的:
typedef struct
{
char* name; //Name of the room
char type; //Type of room
int numOutboundConnections; //Number of rooms connected
int isSelected;; // 0 means not selected, 1 means selected
struct Room *outboundConnections[6]; //Pointers to rooms connected
} Room;
// Room constructor used for filling roomBank
Room room_init(char* name, int s, int c)
{
Room temp;
temp.name = calloc(16, sizeof(char));
strcpy(temp.name, name);
temp.isSelected = s;
temp.numOutboundConnections = c;
return temp;
}
我正在使用此功能将连接添加到outboundConnections数组:
void ConnectRoom(Room *x, Room *y)
{
(*x).outboundConnections[(*x).numOutboundConnections] = malloc(sizeof(Room));
(*x).outboundConnections[(*x).numOutboundConnections] = y;
(*x).numOutboundConnections++;
(*y).outboundConnections[(*y).numOutboundConnections] = malloc(sizeof(Room));
(*y).outboundConnections[(*y).numOutboundConnections] = x;
(*y).numOutboundConnections++;
}
我在outboundConnections数组中获取名称struct成员时遇到问题。
printf("Connection %i: %s", i, x.outboundConnections[i].name);
我尝试使用-> name和(* x.outboundConnections [i])。name。我想知道我是否正确地将Room分配给outboundConnections数组,或者我的问题是我如何尝试访问成员变量。
答案 0 :(得分:1)
outboundConnections
是一个指针数组,因此outboundConnections[i]
是Room *
。同样,x
也是一个指针。您应该使用->
(而不是.
)来访问其成员:
x->outboundConnections[i]->name
答案 1 :(得分:1)
首先,像其他人指出的那样,将(*x).
替换为x->
。
但更重要的是,当您这样做时:
(*x).outboundConnections[(*x).numOutboundConnections] = malloc(sizeof(Room));
(*x).outboundConnections[(*x).numOutboundConnections] = y;
您刚刚泄漏了sizeof(Room)
个字节。如果您要存储指向malloc
的指针,则不需要进行Room
调用。仅在存储Room
的副本时才需要它。因此,如果存储指针,您的代码应如下所示:
x->outboundConnections[x->numOutboundConnections] = y;
或者,如果要存储Room
的副本,则这样:
x->outboundConnections[x->numOutboundConnections] = malloc(sizeof(Room));
*x->outboundConnections[x->numOutboundConnections] = *y;
答案 2 :(得分:0)
outboundConnections
是一个指针数组,因此您必须取消引用该指针才能到达name
成员。
printf("Connection %i: %s", i, x->outboundConnections[i]->name);
在所有情况下,只要您编写(*x).something
,就可以简化为x->something
。
另一个问题是结构本身的声明。你有:
struct Room *outboundConnections[6];
,但是您从未声明过struct Room
。您声明了一个匿名结构,然后为其指定了typedef Room
。您需要将声明更改为:
typedef struct Room
{
char* name; //Name of the room
char type; //Type of room
int numOutboundConnections; //Number of rooms connected
int isSelected;; // 0 means not selected, 1 means selected
struct Room *outboundConnections[6]; //Pointers to rooms connected
} Room;