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