结构的C数组给出随机segfault+;valgrind无效写入错误
当我试图浏览我的结构数组时,我的代码中有一个随机错误 我有一个struct_fd,它包含套接字的值、类型、2个缓冲区和2个函数指针。 我还有我的主服务器“env”结构(struct s_sv_prop),其中包含指向struct_fd数组的指针 标题:结构的C数组给出随机segfault+;valgrind无效写入错误,c,arrays,segmentation-fault,malloc,valgrind,C,Arrays,Segmentation Fault,Malloc,Valgrind,当我试图浏览我的结构数组时,我的代码中有一个随机错误 我有一个struct_fd,它包含套接字的值、类型、2个缓冲区和2个函数指针。 我还有我的主服务器“env”结构(struct s_sv_prop),其中包含指向struct_fd数组的指针 标题: #define MAX_CLIENTS 10 #define MAX_SOCKETS 1 + MAX_CLIENTS #define SK_SERV 0 #define SK_CLIENT 1 #def
#define MAX_CLIENTS 10
#define MAX_SOCKETS 1 + MAX_CLIENTS
#define SK_SERV 0
#define SK_CLIENT 1
#define SK_FREE 2
typedef struct s_fd t_fd;
typedef struct s_sv_prop t_sv_prop;
struct s_fd
{
void (*ft_read)();
void (*ft_write)();
int sock;
int type;
char rd[BUF_SIZE + 1];
char wr[BUF_SIZE + 1];
};
struct s_sv_prop
{
t_cmd *cmd;
t_fd *fds;
fd_set readfds;
fd_set writefds;
int max;
int left;
int port;
};
为结构数组分配内存的函数:
void init_sv_prop(t_sv_prop *sv, char *port, char **env)
{
int i;
i = 0;
sv->max = 0;
sv->left = 0;
check_port(port);
sv->port = (unsigned short) atoi(port);
sv->cmd = (t_cmd *)malloc(sizeof(*(sv->cmd)));
init_env(sv, env); /* initiate other env */
init_command_list(sv); /* malloc an array of another struc */
sv->fds = (t_fd *)malloc(sizeof(*(sv->fds)) * MAX_SOCKETS);
while (i < MAX_SOCKETS) {
clean_fd(&(sv->fds[i]));
i++;
}
}
环境上,当我想显示我的结构状态时,我随机有一个EXC_BAD_ACCESS segfault(但不是每次都是…):
void sv_socket_状态(t_sv_prop*sv,char*tag)
{
int i;
char*str;
char skfr[]=“自由”;
char sksv[]=“服务器”;
char skcl[]=“客户机”;
i=0;
而(ifds[i]。类型==SK_SERV)
str=sksv;
else if(sv->fds[i].type==SK_客户端)
str=skcl;
其他的
str=skfr;
printf(“%5d |%6s |%5d |%6c |%6c\n”),i,str,CL|u SOCK(i),
(FD_ISSET(CL_SOCK(i),&sv->readfds)?“X”:“,
(FD_ISSET(CL_SOCK(i),&sv->writefds)?'X':'');
i++;
}
}
如前所述,当我在OsX上运行代码时,在运行最后一个函数时,我会随机出现一个segfault。
当我在Ubuntu上运行它时,我得到了一个malloc错误,valgrind检测到一个无效的写入错误
我一定错过了我分配的东西。
你知道问题是从哪里来的吗?如,
该行:
sv->fds = (t_fd *)malloc(sizeof(*(sv->fds)) * MAX_SOCKETS);
事实上:
sv->fds = (t_fd *)malloc(sizeof(*(sv->fds)) * 1 + MAX_CLIENTS);
并使malloc的大小为*(sv->fds)+MAX_客户机的值。
宏必须从以下位置开始:
#define MAX_SOCKETS 1 + MAX_CLIENTS
致:
谢谢大家的帮助。请输入
malloc()
和C
中的family的返回值。我删除了演员阵容,仍然得到了问题。@OP no no,那不是asnwer,只是一个建议。你介意给我们看一下t\u fd
结构吗?我已经编辑好在标题中添加“define”。为了清晰起见,我省略了t_sv_prop中的其他结构部分,它们也是使用malloc启动的,但如果需要,我可以添加它们。sizeof(*(sv->fds))*MAX_SOCKETS
=>sizeof(*(sv->fds))*1+MAX_客户机
:因此需要括号。如前所述,在C中,不要强制转换malloc返回的值
sv->fds = (t_fd *)malloc(sizeof(*(sv->fds)) * 1 + MAX_CLIENTS);
#define MAX_SOCKETS 1 + MAX_CLIENTS
#define MAX_SOCKETS (1 + MAX_CLIENTS)