c - Malloc双指针

标签 c

我的函数原型(prototype)应该如下所示:

void double_min_max(int **range, int min, int max)

我必须用从最小到最大的数字填充“范围”。

我不知道如何分配双指针以及如何为每个元素分配最小值。

void    double_min_max(int **range, int min, int max)
{
    range = (int **)malloc(sizeof(int)* 10);
    int i = 0;
        while (min < max)
        {
        **range[i] = min;
        i++;
        min++;
    }
}

最佳答案

好的,让我们找出错误:

void double_min_max(int **range, int min, int max)
{
    range = (int **)malloc(sizeof(int)* 10);

使用 malloc 进行转换是不必要的,甚至可以 lead to problems 。不要这样做。

然后你想分配给*range,而不是rangerange 对于您的函数来说是本地的(在 C 中,所有参数均按值传递),因此修改它永远不会对调用代码产生任何可见的影响。当你调用这个函数时,你应该传递一个指向指针的指针,这样函数就可以通过*range来修改指针。

最后,这应该是显而易见的,但您应该根据 minmax计算所需的大小。 10 只是一个……呃……非常粗略的猜测。这不是一个好主意。

    int i = 0;
        while (min < max)
        {
        **range[i] = min;

这是错误的。 [] 确实取消引用指针,因此这里有三个级别的取消引用。但它只是一个指针到指针,而不是指针到指针。另外,索引先于正常的取消引用,这不是您想要的。请改用 (*range)[i]

        i++;
        min++;
    }
}

合理的实现可能如下所示:

size_t double_min_max(int **range, int min, int max)
{
    // check for valid input
    if (min > max) return 0;

    // calculate required size
    size_t size = max - min + 1;

    *range = malloc(size * sizeof **range);

    // check allocation succeeded:
    if (!*range) return 0;

    for (size_t i = 0; i < size; ++i)
    {
        (*range)[i] = min++;
    }
    return size;
}

这样调用它:

int *range;
size_t result = double_min_max(&range, 10, 20);

// result should now be 11, the size of the array `range` points to

// when done:
free(range);

关于c - Malloc双指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45712052/

相关文章:

c - 使用 C 中的 YAJL 树检测 JSON 文件中的数组时出现问题

C - 当我使用 fopen() 创建文件时,该文件位于哪里?

c - gcc:与源文件位于同一文件夹中的链接库

c - C 中通过函数实现随机数(初级程序员)

c - 如何在emacs的gdb模式下向C程序传递参数

C、从文本文件中读取 double 值

c++ - 如何进行霍夫曼算法的内存实现?

c - 什么时候使用 short 而不是 int?

c - 如何将字符串存储到位以减少内存占用

c - C语言的配对游戏