为什么将第二个值放入此 C 结构的数组中会将第一个插槽的值变成乱码?



我有一个用户数组。目前,我的主要函数正在通过输入两个名称来测试这一点,因此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中有关灵活阵列的文档。

相关内容

最新更新