将文件读入双int指针

时间:2016-04-20 14:11:54

标签: c segmentation-fault pointer-to-pointer

我正在尝试将文件读入数组但是我遇到了分段错误,我知道我没有正确分配内存。我在这做错了什么?我可以使用whileint **ft_create_map(char *filename, int nb_cols, int nb_rows) { int **map; int fd; int row; int col; ssize_t size; char buf[BUF_SIZE]; row = 0; size = 0; col = 0; map = (int **)malloc(nb_rows * sizeof(int *)); if (!map) return (map); map[0] = malloc(sizeof(int) * nb_cols); fd = open(filename, O_RDONLY); if (!fd) return (NULL); while ((size = read(fd, buf, BUF_SIZE))) { if (size < 1) return (NULL); buf[size] = '\0'; if (buf[0] == '\n') { row += 1; col = 0; map[row] = malloc(sizeof(int) * nb_cols); } else { if (buf[0] == '.') map[row][col] = 1; else if (buf[0] == 'o') map[row][col] = 0; col++; } } return (map); } 循环。

修改

我的完整功能,在分为两部分之前

void fill_map(int **map,int fd, int row, int col)
{
    ssize_t size;
    char    buf[BUF_SIZE];

    size = 0;
    while ((size = read(fd, buf, BUF_SIZE)))
    {
        if (size < 1)
           // return (0); commented out for testing
        buf[size] = '\0';
        if (buf[0] == '\n')
        {
            //this was the problem, allocating memory to map[0] twice.
            row += 1;
            map[row] = malloc(sizeof(int) * (col + 1));
            col = 0;
        }
        else
       {
           if (buf[0] == '.')
              map[row][col] = 1;
           else if (buf[0] == 'o')
              map[row][col] = 0;
           col++;
       }
    }
 }

 int        **ft_create_map(char *filename, int nb_cols, int nb_rows)
 {
    int     **map;
    int     fd;
    int     row;
    int     col;
    ssize_t size;
    // char buf[BUF_SIZE];

    row = 0;
    size = 0;
    col = 0;
    map = (int **)malloc(nb_rows * sizeof(int *));
    if (!map)
       return (map);
    map[0] = malloc(sizeof(int) * nb_cols);
    fd = open(filename, O_RDONLY);
    if (!fd)
       return (NULL);
    fill_map(map, fd, row, col);
    return (map);
 }

这里我试图将前一个函数拆分为两个函数,因为我的函数需要少于25行代码。

int cols = count_cols(argv[1]);
int rows = count_rows(argv[1]);
int **arr;
// int  j;
// int i;

arr = ft_create_map(argv[1], cols, rows);
printf_max_square(arr, rows, cols);

在我的主要

rotate

code ideone

2 个答案:

答案 0 :(得分:3)

假设此行在

中得到注释
 // return (0); commented out for testing

read()时刻返回BUF_SIZE,此行

buf[size] = '\0';

写出buf的边界,并用此调用未定义的行为。

答案 1 :(得分:0)

看起来你有潜在的内存泄漏。在ft_create_map you have map[0] = malloc(sizeof(int) * nb_cols);然后在fill_map中,map[row] = malloc(sizeof(int) * (col + 1));位于row==0。因此,如果buf[0] == '\n',这将是一个内存泄漏。

实际上有点惊讶地听到(来自OP)这也导致了段错误,但如果我们知道确切的程序流程,这可能会变得很明显。