访问结构内部的指针数组中的值

时间:2018-10-24 19:50:24

标签: c

我正在尝试访问结构内部的结构指针数组中的结构成员的值。因此,我有一个结构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数组,或者我的问题是我如何尝试访问成员变量。

3 个答案:

答案 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;