c - C中给char ***分配内存

标签 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 是程序中定义的常量。

最佳答案

字符串矩阵或/3D 字符数组:

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

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

它的 char 3D 数组,大小为 matrix[N][R][MAX_STR]

假设,如果有人想要打印我在图中标记为 * 的字符串,即第二个数组中的第三个字符串,那么他/她需要像

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

虽然答案已被接受,但我正在更新我的答案,以便将来发现它有帮助

关于c - C中给char ***分配内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16522035/

相关文章:

c - 凯撒密码和反向文本程序的问题

c - 作用域会影响函数调用的前后增量吗?

c - 错误的指令 - C 代码中的内联汇编语言

c - 自适应(动态)霍夫曼编码 : encode and decode data from file

memory - Lua表内存?

ios - 一个 iOS 应用程序可以使用多少内存?

c - "memory allocation"在C中实际上意味着什么

c++ - 改进 malloc() 算法的下一步是什么?

python - 如何检查字符串是否仅包含字母数字字符和破折号?

c# - 对一个字符串(不是文件)进行解密/加密是一种最简单的方法,两种方法都可行,怎么样?