在C中动态分配字符串矩阵

时间:2012-02-11 23:27:26

标签: c matrix memory-management malloc

我正在尝试从文本文件中读取地图,并根据地图中的行数和列数创建字符串数组。网格中的每个单元格都是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]时,它会发生段错误。

5 个答案:

答案 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("%sstrcpy使用,则可能会给您带来一些麻烦。 ..)。在这种情况下,我宁愿为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 **是二维数组。