所以,我在为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
是程序中定义的常量。
答案 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]
假设有人想要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'列表的空间。希望这说清楚。