当我尝试浏览我的结构数组时,我的代码中有一个随机的段错误。
我有一个struct_fd,它包含一个套接字的值,它的类型,2个缓冲区和2个函数指针。 我也有我的主服务器" env" struct(struct s_sv_prop),包含指向struct_fd数组的指针。
标题:
#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++;
}
}
我使用clean_fd来清除malloc之后的所有可能的内存问题:
void clean_fd(t_fd *fd)
{
fd->type = SK_FREE; /* Valgrind : Invalid write of size 4 */
fd->sock = 0;
bzero(fd->rd, BUF_SIZE + 1);
bzero(fd->wr, BUF_SIZE + 1);
fd->ft_read = NULL;
fd->ft_write = NULL;
}
当我想显示我的结构状态时,我随机地有一个EXC_BAD_ACCESS段错误(不是每次都是......):
void sv_socket_state(t_sv_prop *sv, char *tag)
{
int i;
char *str;
char skfr[] = "FREE";
char sksv[] = "SERVER";
char skcl[] = "CLIENT";
i = 0;
while (i < MAX_SOCKETS)
{
if (sv->fds[i].type == SK_SERV)
str = sksv;
else if (sv->fds[i].type == SK_CLIENT)
str = skcl;
else
str = skfr;
printf("%5d | %6s | %5d | %6c | %6c\n", i, str, CL_SOCK(i),
(FD_ISSET(CL_SOCK(i), &sv->readfds) ? 'X' : ' '),
(FD_ISSET(CL_SOCK(i), &sv->writefds) ? 'X' : ' '));
i++;
}
}
当我在OsX上运行我的代码时,如前所述,我在运行最后一个函数时随机出现了一个段错误。 当我在Ubuntu上运行它时,我得到了malloc错误,而valgrind检测到无效的写错误。
我必须错过我的分配。 你知道问题的来源吗?
答案 0 :(得分:3)