C语言中的结构烦人的问题

时间:2015-05-09 10:52:30

标签: c struct compiler-errors

struct Users{
        int id;
        char msg[];
};

int nUsers;

struct Users users[10];

void connectUser(struct Users user){
     if(nUsers<10){
        for(int i=0;i<10;i++){
                if(users[i]==NULL){
                        users[i]=user;
                        printf("user %d connected!\n", user.id);
                        nUsers++;
                }
        }
    }else
        printf("number of users reached!\n");
}

这是我的代码,当我尝试编译时,会出现错误:

[s3450124@csitprdap01 ~]$ gcc -std=c99 socketserver.c -o socketserver
socketserver.c: In function ‘connectUser’:
socketserver.c:24: error: invalid operands to binary == (have ‘struct Users’ and ‘void *’)
socketserver.c:21: note: The ABI of passing struct with a flexible array member has changed in GCC 4.4
socketserver.c: In function ‘disconnectUser’:
socketserver.c:37: error: incompatible types when assigning to type ‘struct Users’ from type ‘void *’

每次我尝试编译时,都会出现这些错误。你能帮助我吗?

2 个答案:

答案 0 :(得分:3)

当说i = 0时,用户[i]的类型是结构用户。它不是指针,因此不能具有NULL值。这就是你的编译器所抱怨的。你正在检查值是否为NULL时,它不能。您只在比较指针时检查NULL。

// you already check here that you do not exceed bounds of array - 10
for(int i=0;i<10;i++){
    users[i]=user;
    etc

答案 1 :(得分:1)

正如@CoolGuy所注意到的,问题是if(users[i]==NULL)引起的。由于usersstruct Users的数组,users[i]struct Usersstruct Users无法与NULL进行比较。

指向struct Users的指针(声明为struct Users*)可以与NULL进行比较。

现在找到了问题,如何解决?

  • 直截了当的答案是使用约定。例如,让我们说users[i].id==0表示此用户已断开连接。在程序开始时,必须初始化用户:

    for(i=0;i<10;i++){
      users[i].id=0;
    }
    

    当用户连接时,必须找到一个空闲插槽:

     for(int i=0;i<10;i++){
            if(users[i].id==0){
                    users[i]=user;
                    printf("user %d connected!\n", user.id);
                    nUsers++;
                    break;
            }
      }
    

    不要忘记break语句:用户必须只连接一次! 当用户被diconnected时,users[i].id=0;

  • 另一种选择是声明struct Users *users[10];。因此users是指向struct Users的指针数组。同样,必须初始化这些指针:

    for(i=0;i<10;i++){
      users[i]=NULL;
    }
    

    当连接新用户时,必须分配一些内存或必须提供有效指针。

      for(int i=0;i<10;i++){
            if(users[i]==NULL){
                    users[i]=malloc(1*sizeof(struct user));
                    if(users[i]==NULL){printf("malloc failed\n");exit(1);}
                    users[i]->id=user.id;
                    printf("user %d connected!\n", user.id);
                    nUsers++;
                    break;
            }
      }
    

    使用users[i]=&user;不是一个好主意,因为user是一个局部变量:它不存在于函数connectUser(struct Users user)之外。如果这样做,它可能会在其他地方触发未定义的行为。

    当用户断开连接时,必须释放内存并且必须将指针设置为NULLfree(users[i]);users[i]=NULL;