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

时间:2016-09-09 18:25:55

标签: c arrays pointers

我学会了创建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 中执行此操作的方式出了问题。请帮我理解通过传递指针进行二维数组堆分配的方法。感谢。

3 个答案:

答案 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();

请注意,这样更清洁。

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

答案 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));
}

说明: Explanation Image