在C中将内存分配给char ***

时间:2013-05-13 12:27:22

标签: c string memory memory-management matrix

所以,我在为char ***类型变量分配内存时遇到了麻烦。我的目标是创建一个字符串矩阵,我目前用于内存分配的代码如下:

char ***matrix;

matrix = calloc(n*MAX_STR, sizeof(char**));
for(z = 0; z < n; z++) {
    matrix[z] = calloc(n, sizeof(char*));
    for(i = 0; i < MAX_STR; i++) {
        matrix[z][i] = calloc(MAX_STR, sizeof(char));
    }
}

我已成功为字符串数组分配内存,使用:

char **list;
list = calloc(n, sizeof(char *));
for (j = 0; j < n; j++){
list[j] = calloc(MAX_STR, sizeof(char));
}

但我现在遇到矩阵问题。

在Valgrind上使用--leak-check = full运行程序会给我以下消息:

==5126== Invalid write of size 8
==5126==    at 0x400B9F: createmat (proj.c:100)
==5126==    by 0x401598: main (proj.c:237)
==5126==  Address 0x5210878 is 0 bytes after a block of size 72 alloc'd
==5126==    at 0x4C2ABB4: calloc (vg_replace_malloc.c:593)
==5126==    by 0x400B52: createmat (proj.c:98)
==5126==    by 0x401598: main (proj.c:237)

我想弄清楚为此分配内存,因为在C语言管理方面我还是初学者。任何帮助都会受到赞赏,谢谢。

编辑: 矩阵应该存储n个字符串数组,这些字符串对应于输入的行(稍后用fgets读取),并且每个数组分配行所具有的任意数量的单词,每个单词(读取,每个字符串)最多有MAX_STR个字符。 n是从输入读取的变量,而MAX_STR是程序中定义的常量。

3 个答案:

答案 0 :(得分:6)

String或/ 3D char数组的矩阵:

假设您需要N矩阵,每个矩阵可以存储R 长度 MAX_STR-1的字符串,那么您应该按如下方式为循环分配内存,例如:< / p>

char ***matrix;

matrix = calloc(N, sizeof(char**)); 
for(z = 0; z < N; z++) { 
    matrix[z] = calloc(R, sizeof(char*));
    for(i = 0; i < R; i++) {
        matrix[z][i] = calloc(MAX_STR, sizeof(char));
    }
}

它将创建矩阵,如:

matrix
+-------------------+------------------+-----------------------+
| 0                 | 1                | 2                     |
+-------------------+------------------+-----------------------+        
 |                           |                        |
 ▼                           ▼                        ▼
+--+    +----------+       +--+    +----------+     +--+    +----------+
|0 +---►| MAX_STR  |       |0 +---►| MAX_STR  |     |0 +---►| MAX_STR  |
+--+    +----------+       +--+    +----------+     +--+    +----------+
|1 +---►| MAX_STR  |       |1 +---►| MAX_STR  |     |1 +---►| MAX_STR  |
+--+    +----------+       +--+    +----------+     +--+    +----------+
|2 +---►| MAX_STR  |       |2 +---►| MAX_STR  |*    |2 +---►| MAX_STR  |
+--+    +----------+       +--+    +----------+     +--+    +----------+
|3 +---►| MAX_STR  |       |3 +---►| MAX_STR  |     |3 +---►| MAX_STR  |
+--+    +----------+       +--+    +----------+     +--+    +----------+
|4 +---►| MAX_STR  |       |4 +---►| MAX_STR  |     |4 +---►| MAX_STR  |
+--+    +----------+       +--+    +----------+     +--+    +----------+
|5 +---►| MAX_STR  |       |5 +---►| MAX_STR  |     |5 +---►| MAX_STR  |
+--+    +----------+       +--+    +----------+     +--+    +----------+
|6 +---►| MAX_STR  |       |6 +---►| MAX_STR  |     |6 +---►| MAX_STR  |
+--+    +----------+       +--+    +----------+     +--+    +----------+
|7 +---►| MAX_STR  |       |7 +---►| MAX_STR  |     |7 +---►| MAX_STR  |
+--+    +----------+       +--+    +----------+     +--+    +----------+
 ^        ^ 
 |        |
 |        matrix[z][i]
 matrix[z]

这里N = 3,和      R = 8

其大小为matrix[N][R][MAX_STR]

的char 3D数组

假设有人想要printf字符串我在图中标记*,那是第二个数组中的第三个字符串,那么他/她需要索引像

printf("%s",matrix[1][2]);

虽然答案被接受但我正在更新我的答案,所以onw可以在将来发现它有用

答案 1 :(得分:5)

假设您要为n数组分配存储空间,每个数组都包含n个字符串,每个字符串长达MAX_STR,代码中会出现一些错误

matrix = calloc(n*MAX_STR, sizeof(char**));

应该是

matrix = calloc(n, sizeof(char**));

for(i = 0; i < MAX_STR; i++) {

应该是

for(i = 0; i < n; i++) {

更详细一点,

matrix = calloc(n*MAX_STR, sizeof(char**));
for(z = 0; z < n; z++) {

似乎错了。您分配了n*MAX_STR个元素,但只使用了n个元素

matrix[z] = calloc(n, sizeof(char*));
for(i = 0; i < MAX_STR; i++) {

n<MAX_STR也有疑问和错误。 (您分配n个元素,然后写入MAX_STR个元素。)

最后,根据您是否考虑MAX_STR为空终止符包含空格,您可能需要更改

matrix[z][i] = calloc(MAX_STR, sizeof(char));

matrix[z][i] = calloc(MAX_STR+1, 1);

答案 2 :(得分:1)

正如您所说,您可以使用以下代码成功创建字符串数组:

char **list;
list = calloc(n, sizeof(char *));
for (j = 0; j < n; j++){
list[j] = calloc(MAX_STR, sizeof(char));
}

现在,您需要一个字符串数组数组,因此它应该是:

char ***matrix;

matrix = calloc(n, sizeof(char**)); //This creates space for storing the address of 'n' array of strings 
for(z = 0; z < n; z++) { //This loop creates the 'n' array of strings.
    matrix[z] = calloc(n, sizeof(char*));
    for(i = 0; i < n; i++) {
        matrix[z][i] = calloc(MAX_STR, sizeof(char));
    }
}

所以,基本上,在第二个代码中,您只是创建用于存储'n'列表的空间。希望这说清楚。