将结构的地址分配给C中的其他结构

时间:2014-06-03 18:47:12

标签: c pointers struct

我想找到第一个链表。我有个主意。

我将在struct中获取第一个地址。我无法创建first或somemockup结构,因为我将多次使用此函数。

这些是我的结构:

typedef struct user user;
typedef struct message message;
struct message
{
    int id;
    int user;
    message *next;
    message *firstm;
};
struct user
{
    char name[10];
    int id;
    message *messages;
    user *next;
};

我添加了用户和ID。没关系。 我想添加像这样的用户的消息(不是2d数组或类似的东西)

我会做出类似的事情:

firstme = &(temp->messages->firstm);
for (; temp->messages->next != NULL; temp->messages = temp->messages->next){}
temp->messages->firstm = firstme;
temp->messages->next = NULL;

没关系。我接受了第一个消息结构的地址。

但之后我想用它,因为我想打印所有。

for (temp->messages = (temp->messages->firstm); temp->messages->next != NULL; temp->messages = temp->messages->next){}

但这不起作用。

&(temp->messages) = *(temp->messages->firstm) //<- that doesn't work too :(
(temp->messages) = *(temp->messages->firstm) //<- that doesn't work too :(

感谢您的帮助:)

2 个答案:

答案 0 :(得分:1)

您的类型不匹配。你取消引用temp->messages->firstm所以它是struct message的类型。 messages是结构消息的指针类型,&(temp->messages)是一个指针(但指向指针的指针)。

将所有特殊操作数保留在您遇到问题的行之外。

答案 1 :(得分:0)

我认为这就是你想要实现的目标(你可以检查here它是否有效,你只需要一个C99编译器):

#include <stdio.h>

typedef struct user user;
typedef struct message message;
struct message
{
    int id;
    int user;
    message *next;
    message *firstm;
};

struct user
{
    char name[10];
    int id;
    message *messages;
    user *next;
};

int main(void) {
    //initialize somme dummy structures
    user users[4] = {
        {.name = {0} }
    };
    message msgs[4] = {{0}};

    for (int i = 0; i < 4; i++) {
        msgs[i].firstm = &msgs[0];
        msgs[i].next = &msgs[i+1];
        msgs[i].id = i;
        users[i].messages = &msgs[0];
        users[i].next = &users[i+1];
    }
    msgs[4].next = NULL;
    users[4].next = NULL;

    //iterate through messages in first user and print ids
    user *temp = &users[0];
    for (message *firstme = temp->messages->firstm;
            firstme->next != NULL;
            firstme = firstme->next) {
        printf("%d \n", firstme->id );
    }

    return 0;
}