我正在尝试将文件读入数组但是我遇到了分段错误,我知道我没有正确分配内存。我在这做错了什么?我可以使用while
和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);
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
答案 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)这也导致了段错误,但如果我们知道确切的程序流程,这可能会变得很明显。