我学会了创建2-D char数组的堆分配并初始化它。
方法1:
#include <stdio.h>
#include <stdlib.h>
int main()
{
char ** arr;
arr = (char **) malloc(2 * sizeof(char *));
arr[0] = (char *) malloc(256 * sizeof(char));
arr[1] = (char *) malloc(256 * sizeof(char));
sprintf(arr[0], "%s", "This is string 1");
sprintf(arr[1], "%s", "This is string 2");
int i;
for(i = 0; i < 2; i++)
{
printf("%s\n", arr[i]);
}
return 0;
}
但我试图学习的是将指针传递给一个函数以创建一个二维数组,但是徒劳无功。
方法2:
#include <stdio.h>
#include <stdlib.h>
void test(char *** ptr);
int main()
{
char ** arr;
test(&arr);
sprintf(arr[0], "%s", "This is string 1");
sprintf(arr[1], "%s", "This is string 2");
int i;
for(i = 0; i < 2; i++)
{
printf("%s\n", arr[i]);
}
return 0;
}
void test(char *** ptr)
{
**ptr = (char **) calloc(2, sizeof(char *));
*ptr[0] = (char *) malloc(256 * sizeof(char));
*ptr[1] = (char *) malloc(256 * sizeof(char));
}
我在方法2 中执行此操作的方式出了问题。请帮我理解通过传递指针进行二维数组堆分配的方法。感谢。
答案 0 :(得分:3)
在第一次分配时,您没有使用适当的间接级别。您想要*ptr
,而不是**ptr
。
对于第二次和第三次分配,运算符优先级正在为您提供帮助。数组索引运算符[]
的优先级高于解除引用运算符*
,因此您需要括号来首先取消引用,然后索引数组:
void test(char *** ptr)
{
*ptr = calloc(2, sizeof(char *));
(*ptr)[0] = malloc(256 * sizeof(char));
(*ptr)[1] = malloc(256 * sizeof(char));
}
不是使用三重指针(你发现它可能令人困惑),而是返回分配的值并将其分配给你的变量:
char **test()
{
char **ptr = calloc(2, sizeof(char *));
ptr[0] = malloc(256 * sizeof(char));
ptr[1] = malloc(256 * sizeof(char));
return ptr;
}
...
arr = test();
请注意,这样更清洁。
答案 1 :(得分:0)
由于operator precedence,表达式*ptr[0]
被解析为*(ptr[0])
,这实际上并不正确。
您需要使用明确的括号来克服它,如(*ptr)[0]
。
作为一个不相关的旁注,被称为three star programmer通常不是一种恭维。
答案 2 :(得分:0)
注意:
*ptr[0] == *(ptr[0]) == **ptr
因此
*ptr[1] == *(ptr[1]) == *(*(ptr+1)) == unknown memory
固定代码:
void test(char *** ptr)
{
*ptr = (char** ) calloc(2, sizeof(char *));
(*ptr)[0] = (char* ) malloc(256 * sizeof(char));
(*ptr)[1] = (char* ) malloc(256 * sizeof(char));
}