Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何传递指针在堆上创建二维数组?_C_Arrays_Pointers - Fatal编程技术网

C 如何传递指针在堆上创建二维数组?

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

我学会了创建二维字符数组的堆分配并初始化它

方法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;
}
#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推荐的参考资料与本网站无关。此外,“三星级程序员”的概念意味着您正在使代码变得比需要的更复杂。答案中的第二个例子更简洁,更容易阅读,并且不依赖于括号来确保事情正确进行。