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

时间:2014-11-09 08:04:09

标签: c arrays struct

我有一组用户。目前我的主要功能是通过输入两个名称来测试它,因此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;
}

1 个答案:

答案 0 :(得分:0)

问题在于:

amigoNet = (struct AmNet *)malloc(sizeof(struct AmNet));

它不为数组amigoNet->users分配任何空间。你应该使用:

amigoNet = (struct AmNet *)malloc(sizeof(struct AmNet) + MAX_USERS*sizeof(struct User_struct *));

或类似的东西。请参阅C99中有关灵活阵列的文档。