因此,我在为 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/