gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 18:36:56 24 4
gpt4 key购买 nike

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

方法一:

#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中执行此操作的方式有问题。请帮助我理解通过传递指针来进行二维数组的堆分配的方法。谢谢。

最佳答案

在第一次分配时,您没有使用正确的间接级别。您需要的是 *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();

请注意,这更加干净。

此外,don't cast the return value of malloc/calloc/realloc .

关于c - 如何传递指针在堆上创建二维数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39417669/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com