C 动态分配的动态分配结构列表正在覆盖
在下面的代码中,我一辈子都不明白为什么在使用addUser方法添加2个或多个具有不同名称的User结构之后,运行dump_data方法时会得到相同的输出,即相同的名称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 {
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: