动态分配动态分配的结构列表将被覆盖

时间:2014-11-08 22:24:27

标签: c memory-management malloc

在下面的代码中,我无法弄清楚为什么在添加2个(或更多)User_struct后运行dump_data()方法时获得相同输出(即同名)的原因不同的名称)使用addUser()方法。

struct Friends_struct {
    struct User_struct *this;
    struct Friends_struct *next;
};

typedef struct Friends_struct *Friends;    

typedef struct User_struct {
    const char *name;
    Friends amigos;
} User;

static User **userList;             // global table of users
static int numUsers;                // global number of users
static int tableSize;               // global size of table


void create_amigonet() {    
    tableSize = INIT_TABLE_SIZE;
    numUsers = 0;

    userList = malloc(tableSize * sizeof(User *));
}

void addUser(const char *name) {
    userList[numUsers] = malloc(sizeof(User));
    userList[numUsers]->name = name;
    userList[numUsers]->amigos = 0;

    numUsers++;

    if (numUsers == tableSize) {
        tableSize += INIT_TABLE_SIZE;

        User **moreUsers;
        moreUsers = realloc(userList, tableSize * sizeof(User *));
        userList = moreUsers;
    }
}

void dump_data() {
    for (int i=0; i<numUsers; i++) {
        printf("%s; friends:", userList[i]->name);
    }

    printf("\n");
}

不同的.c文件:

void do_add(const char *name) {
    addUser(name);
}

int main(void) {
    create_amigonet();
    do_add("Dan");
    do_add("Jim");
    dump_data();
}

如果运行,我期望的输出就像

Dan; friends:
Jim; friends:

但我正在

Jim; friends:
Jim; friends:

我如何/在哪里覆盖我的数据?

1 个答案:

答案 0 :(得分:0)

问题是你只在char中存储了一个User_struct指针,而在addUser调用中传递的指针只是临时指针。您应该将name的类型更改为足够长度的char数组,并使用strcpyaddUser内复制该名称。

我无法完全解释为什么该示例实际显示错误,因为我认为两个名称字符串在整个main()中都应该有效,但似乎生成的代码重用了&#34; Dan&#34的位置;存储,因此你得到&#34;吉姆&#34;第二次addUser电话后两次。