我正在尝试从文本文件中读取地图,并根据地图中的行数和列数创建字符串数组。网格中的每个单元格都是2个字符的字符串。
例如,
**--**--**--
--**--**--**
应创建一个2 * 6矩阵。行数和列数分别为ROWS和COLS。我用了
char ***map = malloc(ROWS * sizeof(char *));
for (i = 0; i < ROWS; i++)
{
map[i] = malloc(COLS * sizeof(char) * 2);
}
但是当我尝试使用map[x][y]
时,它会发生段错误。
答案 0 :(得分:1)
char ***map;
可以解释为“字符串数组”,因此内部数组实际上包含char指针。因此,您的循环需要如下所示:
for(i = 0; i < ROWS; i++) {
int j;
map[i] = malloc(COLS * sizeof(char*));
for(j = 0; j < COLS; j++) map[i][j] = malloc(3 * sizeof(char)); // 3 chars because a string has to be terminated by \0
}
或者,您可以将地图声明为char **map
,然后您的初始化代码就可以使用,但是您需要使用map[i][j]
和map[i][j+1]
来访问各个单元格的元素
答案 1 :(得分:1)
看起来像这样:
int i, j, ROWS = 2, COLS = 6;
char ***map = malloc(ROWS * sizeof(char **));
for (i = 0; i < ROWS; ++i)
{
map[i] = malloc(COLS * sizeof(char*));
for (j = 0; j < COLS; ++j)
map[i][j] = malloc(2 * sizeof(char));
}
请注意,2 char
允许您存储这些字符,但如果您要将它们作为字符串(printf("%s
,strcpy
使用,则可能会给您带来一些麻烦。 ..)。在这种情况下,我宁愿为3 char
s分配内存,以便也可以存储终止字符。
另请注意,分配后应清理此内存,并根据分配以相反的顺序进行清洁。它看起来像这样:
for (i = 0; i < ROWS; ++i)
{
for (j = 0; j < COLS; ++j)
free(map[i][j]);
free(map[i]);
}
free(map);
希望这有帮助。
答案 2 :(得分:0)
如果您想要2D数组,那么您将map
声明为char***
吗?将其更改为char**
。
(如果我误解了,并且您想要char*
的2D数组,则应更改分配,使用sizeof(char**)
和sizeof(char*)
,并分别将内存分配给字符串。)< / p>
编辑:如果您在声明地图时知道地图的大小,请将其设为char map[ROWS][COLS][2];
如果您不这样做(或者您只想将其传递给其他函数),您可以将其声明为char (**map)[2]
,并按原样保留您的分配。
(如果您要2
终止3
,请将\0
更改为{{1}}(例如,打印)
答案 3 :(得分:0)
需要
char ***map = malloc(ROWS * sizeof(char**));
for (i = 0; i < ROWS; i++)
{
map[i] = malloc(COLS * sizeof(char*));
for (int j=0; i<COLS; ++j)
map[i][j] = malloc(3*sizeof(char);
}
编辑:正如另一个答案和评论所指出的,应该是3个不是2个malloc'ed字符。
答案 4 :(得分:0)
第一行应该是:
char **map = malloc(ROWS * sizeof(char *));
根据经验,将一个*
添加到malloc()的返回类型中。如果您使用malloc(5 * sizeof(int))
分配五个整数的数组,那么您将获得int *
。
或者,您可以将每个*
视为添加维度 - char *
是一维字符数组,char **
是二维数组。