C 如何传递指针在堆上创建二维数组?
我学会了创建二维字符数组的堆分配并初始化它 方法1:C 如何传递指针在堆上创建二维数组?,c,arrays,pointers,C,Arrays,Pointers,我学会了创建二维字符数组的堆分配并初始化它 方法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(c
#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;
}
#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));
}
#包括
#包括
int main()
{
字符**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”,“这是字符串1”);
sprintf(arr[1],“%s”,“这是字符串2”);
int i;
对于(i=0;i<2;i++)
{
printf(“%s\n”,arr[i]);
}
返回0;
}
但我试图学习的是将指针传递给函数以创建二维数组,但徒劳
方法2:
#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;
}
#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));
}
#包括
#包括
空隙试验(字符***ptr);
int main()
{
字符**arr;
测试(&arr);
sprintf(arr[0],“%s”,“这是字符串1”);
sprintf(arr[1],“%s”,“这是字符串2”);
int i;
对于(i=0;i<2;i++)
{
printf(“%s\n”,arr[i]);
}
返回0;
}
无效测试(字符***ptr)
{
**ptr=(char**)calloc(2,sizeof(char*);
*ptr[0]=(char*)malloc(256*sizeof(char));
*ptr[1]=(char*)malloc(256*sizeof(char));
}
我在方法2中的操作方式有问题。请帮助我理解通过传递指针进行二维数组堆分配的方法。谢谢。因为表达式*ptr[0]
被解析为*(ptr[0])
,这是不正确的
您需要使用显式括号来克服它,如(*ptr)[0]
中所述
作为一个不相关的旁注,被称为a通常不是一种恭维。在第一次分配时,您没有使用适当的间接级别。您想要的是
*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();
请注意,这要干净得多
另外,请注意:
*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));
}
说明:
但是警告消息在测试的行中(char***ptr):**ptr=(char**)calloc(2,sizeof(char*);没有一个代码段使用2D数组,包含可以表示或指向一的内容!指针不是数组!告诉你不同的人都是错的。如果您需要二维阵列,请使用一个!那么你也是一个三星级的C程序员了?;-)
void
函数不返回not-a-2D-array数组的任何原因?(为什么不使用2D数组?)?请告诉我一些教程或学习资源,以掌握这一三星级编程概念。谢谢。@Rahul推荐的参考资料与本网站无关。此外,“三星级程序员”的概念意味着您正在使代码变得比需要的更复杂。答案中的第二个例子更简洁,更容易阅读,并且不依赖于括号来确保事情正确进行。