sách gpt4 ai đã đi

c - struct 中的结构数组

In lại 作者:行者123 更新时间:2023-11-30 14:25:09 27 4
mua khóa gpt4 Nike

#include 
#include
#include
#include
#include
#include


typedef struct user {
char *username;
struct sockaddr_in addr;
} user;

user* users;

typedef struct room
{
char *roomname;
user* users;
} room;

room* rooms;

int addToUsersArray(char *username) {
int i = 0;

for(; i<10; i++) {
if(users[i].username=='\0') {
users[i].username = username;
return 1;
} else if(strcmp(users[i].username, username) == 0)
return -1;
}
return -1;
}


void initUsersArray() {
users = (user*) calloc(10, sizeof(user));
}

void initRoomsArray() {
rooms = (room*) calloc(10, sizeof(room));
int i =0;
for(;i<10;i++)
rooms[i].users = (user*) calloc(10,sizeof(user));
}

int addToRoomsArray(char *roomname) {
int i = 0;

for(; i<10; i++) {
if(rooms[i].roomname=='\0') {
rooms[i].roomname = roomname;
return 1;
} else if(strcmp(rooms[i].roomname, roomname) == 0)
return -1;
}
return -1;
}

int addUserToRoom(char *roomname, user usr) {
int i = 0;
int k = 0;

for(; i<10; i++) {
if(rooms[i].roomname=='\0') {
rooms[i].roomname = roomname;
return 1;
} else if(strcmp(rooms[i].roomname, roomname) == 0) {
for(;k<10;k++) {
if(rooms[i].users[k].username==NULL) { //This line makes trouble
rooms[i].users[k] = usr;
}
}
}

}
return -1;
}


int main(int argc, char** argv) {
initUsersArray();
initRoomsArray();
char *username = "Max";
addToUsersArray(username);
username = "Ma1x";
addToUsersArray(username);
printf("%s\n",users[0].username);
printf("%s\n",users[1].username);

struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(4444);
addr.sin_addr.s_addr = inet_addr("127.0.0.1");

char *room = "sportchat";
addToRoomsArray(room);
room = "berlinchat";
addToRoomsArray(room);

printf("%s\n",rooms[0].roomname);
printf("%s\n",rooms[1].roomname);

user michi;
michi.username = "michi";
michi.addr = addr;

struct sockaddr_in addr2;
addr2.sin_family = AF_INET;
addr2.sin_port = htons(1234);
addr2.sin_addr.s_addr = inet_addr("127.0.1.1");

user willi;
willi.username = "willi";
willi.addr = addr2;

addUserToRoom(room,michi);
addUserToRoom(room,willi);


return 1;
}

运行 addUserToRoom(room,michi) 时出现段错误。我对使用结构仍然有点不确定。注释掉时rooms[i].users[k] = usr;段错误消失。我在unix系统上使用gcc。 gcc 是否分析带有空 block 的 if 表达式?

biên tập如何实现可变数量的用户和房间?我想我必须使用 realloc。但如何呢?问候

1 Câu trả lời

你从不分配内存,也不初始化

room.users

因此,当您尝试访问 rooms[i].users[k] 时,您会遇到段错误。

作为旁注:永远不要使用全局变量,否则你会做愚蠢的事情(当你使用与结构成员同名的全局变量时,情况会更糟)。另外,始终在 for 循环的第一部分初始化迭代变量。 (你知道有人会因为比这个少而死吗?:P)

以下是您的主要功能的示例:

int chính() {
room* rooms;
user* users;

initUsersArray(users);
initRoomsArray(rooms);

char *username = "Max";
addToUsersArray(users,username);
username = "Ma1x";
addToUsersArray(users,username);
printf("%s\n",users[0].username);
printf("%s\n",users[1].username);

struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(4444);
addr.sin_addr.s_addr = inet_addr("127.0.0.1");

char *room = "sportchat";
addToRoomsArray(rooms,room);

/* ... */

return 1;
}

关于c - struct 中的结构数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10666839/

27 4 0
Bài viết được đề xuất: c - 需要帮助从 ltp 测试套件文件 tst_res.c 理解这个宏
Bài viết được đề xuất: Lập trình CGI
Bài viết được đề xuất: C 获取代码内的编译选项
Bài viết được đề xuất: c - 在 ANSI C 中将 Int 值序列化到 char* 缓冲区
行者123
Hồ sơ cá nhân

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá Didi Taxi miễn phí
Mã giảm giá Didi Taxi
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com