结构的C数组给出随机segfault+;valgrind无效写入错误

结构的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

当我试图浏览我的结构数组时,我的代码中有一个随机错误

我有一个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
#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)