我有一个用户数组。目前,我的主要函数正在通过输入两个名称来测试这一点,因此addUser函数将同时处理这两种情况。第一个值输入时没有问题,并保持在那里直到行:
amigoNet->users[counter] = newUser;
然后第二个值落入第二个槽中,但用户[0]名称处的第一个值变成了类似于的值
S
@
我哪里出了问题,为什么它能够以这种方式破坏第一个元素的值?我不能修改User结构,但我可以更改AmNet。
这是包含用户列表的AmNet结构:
typedef struct User_struct {
const char *name;
Friends amigos;
} User;
用户结构:
typedef struct AmNet {
int size; // hashtable size?
User *front; // the first user
User *back; // the last user
User *users[]; // group of users in the net
}
在中添加用户的功能
void addUser( const char *name ) {
User *newUser = malloc(sizeof(User));
newUser->name = name;
newUser->amigos = NULL;
// if amigonet users is empty
if (amigoNet->front == NULL) {
amigoNet->front = newUser;
amigoNet->users[0] = newUser;
}
else { // if amigonet users is not empty
int counter = 0;
int flag = 0;
// go through users until we have an empty spot
while (amigoNet->users[counter+1] != NULL) {
if (amigoNet->users[counter]->name == name) {
flag++;
}
counter++;
}
if (flag < 1) { // if it's a unique name
amigoNet->users[counter] = newUser;
amigoNet->users[counter]->name = name;
amigoNet->users[counter]->amigos = NULL;
amigoNet->back = amigoNet->users[counter];
}
}
}
AmNet实例在此处创建:
void create_amigonet(){
amigoNet = (struct AmNet *)malloc(sizeof(struct AmNet));
amigoNet->size = 0;
amigoNet->front = NULL;
amigoNet->back = NULL;
}
问题就在这里:
amigoNet = (struct AmNet *)malloc(sizeof(struct AmNet));
它不为数组amigoNet->users
分配任何空间。您应使用:
amigoNet = (struct AmNet *)malloc(sizeof(struct AmNet) + MAX_USERS*sizeof(struct User_struct *));
或者类似的东西。请参阅C99中有关灵活阵列的文档。