打印链表分段故障

时间:2018-02-02 07:07:59

标签: c unix linked-list ls

我尝试编写“ls”unix命令。 我将数据信息保存在链表中,但是当我想要打印这个链表时,她就会出错:

我如何获取数据?

#include "ft_ls.h"

static void     my_lstadd(t_data **alst, t_data *new)
{
    new->next = (*alst);
    (*alst) = new;
}

static void     ft_getstat(char *this, t_data **data)
{
    struct stat         fstat;
    struct  passwd  *duser;
    struct  group       *dgroup;
    t_data                  *tmp;

    if (stat(this, &fstat) == -1)
    {
        perror("");
        exit(0);
    }
    tmp = (t_data*)malloc(sizeof(t_data));
    duser = getpwuid(fstat.st_uid);
    dgroup = getgrgid(fstat.st_gid);
    tmp->name = ft_strdup(this);
    tmp->type = ft_type(this);
    tmp->right = ft_right(fstat);
    tmp->link = fstat.st_nlink;
    tmp->owner = ft_strdup(duser->pw_name);
    tmp->grp = ft_strdup(dgroup->gr_name);
    tmp->size = fstat.st_size;
    tmp->date = ft_date_converter(ctime(&fstat.st_mtime));
    my_lstadd(data, tmp);
}

t_data          *ft_getdata(char *dirname, int option)
{
    t_data          *data;
    int             i;
    DIR             *dir;
    struct dirent   *file;

    i = 0;
    dir = opendir(dirname);
    while ((file = readdir(dir)))
    {
        if (option == 1)
            ft_getstat(file->d_name, &data);
        else if (file->d_name[0] != '.')
            ft_getstat(file->d_name, &data);
    }
    closedir(dir);
    return (data);
}

我的打印功能-l选项:

#include "ft_ls.h"

static void     ft_get_right(t_data *data)
{
    ft_putchar('\n');
    ft_putchar(ft_type(data->name));
    ft_putright(data->right);
    ft_print_space(3, data->link);
}

void            ft_print_l(t_data **data)
{
    t_data      *ptrdata;

    ptrdata = *data;
    while (ptrdata)
    {
        ft_get_right(ptrdata);
        ft_putnbr(ptrdata->link);
        ft_putchar(' ');
        ft_putstr(ptrdata->owner);
        ft_putchar(' ');
        ft_putstr(ptrdata->grp);
        ft_print_space(6, ptrdata->size);
        ft_putnbr(ptrdata->size);
        ft_putchar(' ');
        ft_putstr(ptrdata->date);
        ft_putchar(' ');
        ft_putstr(ptrdata->name);
        ptrdata = ptrdata->next;
    }
}

结果:

./ft_ls -l

-rw-r--r--  1 cgaspart 2017_paris     0 Jan  4 15:26 zebulo
drwxr-xr-x 14 cgaspart 2017_paris   476 Jan 31 13:50 src
drwxr-xr-x 15 cgaspart 2017_paris   510 Feb  2 08:00 obj
-rw-r--r--  1 cgaspart 2017_paris  1758 Jan 30 10:03 Makefile
drwxr-xr-x 67 cgaspart 2017_paris  2278 Jan 31 13:48 libft
drwxr-xr-x  3 cgaspart 2017_paris   102 Jan 31 12:23 include
-rwxr-xr-x  1 cgaspart 2017_paris 14464 Feb  2 08:00 ft_ls
-rw-r--r--  1 cgaspart 2017_paris     8 Jan  4 15:26 auteur[1]    42763 segmentation fault  ./ft_ls -l

我猜我的打印功能中的“ptrdata”永远不会为NULL然后“while”永远不会停止。我尝试在ft_getstat中设置tmp->旁边的NULL,但这不起作用。

0 个答案:

没有答案