Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 动态分配的动态分配结构列表正在覆盖_C_Memory Management_Malloc - Fatal编程技术网

C 动态分配的动态分配结构列表正在覆盖

C 动态分配的动态分配结构列表正在覆盖,c,memory-management,malloc,C,Memory Management,Malloc,在下面的代码中,我一辈子都不明白为什么在使用addUser方法添加2个或多个具有不同名称的User结构之后,运行dump_data方法时会得到相同的输出,即相同的名称 struct Friends_struct { struct User_struct *this; struct Friends_struct *next; }; typedef struct Friends_struct *Friends; typedef struct User_struct {

在下面的代码中,我一辈子都不明白为什么在使用addUser方法添加2个或多个具有不同名称的User结构之后,运行dump_data方法时会得到相同的输出,即相同的名称

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");
}
如果运行这个,我期望的输出将是

Dan; friends:
Jim; friends:
然而,我越来越

Jim; friends:
Jim; friends:

如何/在何处覆盖数据?

问题在于,在User\u struct中只存储了一个char指针,而在addUser调用中传递的指针只是临时的。您应该将名称的类型更改为足够长的字符数组,并使用strcpy在addUser中复制名称


我无法完全解释为什么该示例实际显示错误,因为我认为这两个名称字符串在整个main中都应该有效,但生成的代码似乎正在重用存储Dan的位置,因此在第二次addUser调用后,您将获得Jim两次。

未编译。当我修复编译错误时,它会按预期工作。userList[numUsers]->amigos=0;这是错误的。amigos是一个Friends结构,您不能将其赋值为0。还包括dumpData或dump_data?1用户列表[numUsers]->amigos=0;->userList[numUsers]->amigos=朋友{0};2无效转储_数据{->无效转储数据{那么,使用控制台的输入可能不同于发布的代码。是的,很抱歉,我试图发布一个完整的示例。上面引用的main实际上位于另一个.c文件中。示例代码更新以便于更好地理解。抱歉。是的,在不同的情况下,当名称字符串超出范围时,代码会爆炸。这里将显示生存,因为字符串Dan和Jim将在数据段中结束,并在应用程序的生命周期内有效。
Jim; friends:
Jim; friends: