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

时间:2015-06-25 09:30:40

标签: c arrays segmentation-fault malloc valgrind

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

我有一个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检测到无效的写错误。

我必须错过我的分配。 你知道问题的来源吗?

1 个答案:

答案 0 :(得分:3)

正如BLUEPIXY comments所述, 这一行:

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_CLIENTS的值。 宏必须来自:

#define MAX_SOCKETS     1 + MAX_CLIENTS

为:

#define MAX_SOCKETS     (1 + MAX_CLIENTS)

感谢大家的帮助。