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

所以,我在为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是程序中定义的常量。

假设您要为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也是有问题的并且是错误的。 (您分配n元素然后写入它们的MAX_STR 。)

最后,根据您是否认为MAX_STR包含空终止符的空间,您可能需要更改

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

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

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

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

 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三维matrix[N][R][MAX_STR]

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

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

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

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

 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”列表的空间。 希望这说清楚。