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 *’
每次我尝试编译时,都会出现这些错误。你能帮助我吗?
答案 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)
引起的。由于users
是struct Users
的数组,users[i]
是struct Users
而struct 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)
之外。如果这样做,它可能会在其他地方触发未定义的行为。
当用户断开连接时,必须释放内存并且必须将指针设置为NULL
:free(users[i]);users[i]=NULL;