Malloc双指针

时间:2017-08-16 11:14:49

标签: c

我的函数原型应如下所示:

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

我必须填写'范围'从最小到最大的数字

我不知道如何对双指针进行malloc以及如何为每个元素分配最小数量。

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++;
    }
}

2 个答案:

答案 0 :(得分:4)

好的,让我们发现错误:

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);

答案 1 :(得分:0)

使用**range = malloc...,您实际访问/分配第一个整数值,“指向int的指针”(这是int **range表示的)点。 这应该是*range = malloc...。此外,**range[i]是非法的,因为**range是整数值,而不是数组或指针,因此**range[i]=min取消引用整数值(在此上下文中是非法/未定义的行为) 。它应该是*range[i]=min

因此完整的代码包括一些必要的检查,函数的使用以及结果的使用可能如下所示:

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

    // range is a pointer PPI to a pointer PI pointing to one (or more consecutive) integers I
    // *range is the "value" of PI, i.e. the pointer to the memory block representing the sequence of integers

    if (min >= max)  // check if the range is valid
        return 0;

    if (!range) // check if you may assign a value to *range
        return 0;

    int size = max - min;
    int *intArray = malloc(size * sizeof(int));
    if (!intArray) // did malloc fail?
        return 0;

    // fill the range
    for (int i=0; i<size; i++) {
        intArray[i] = min+i;
    }

    // let *range point to the malloced and filled array
    *range = intArray;

    // return the size of the array.
    return size;
}

int main() {

    int *myRange = NULL;
    int size = double_min_max(&myRange, -30, -10);

    if (size && myRange) {
        for (int i=0; i<size; i++) {
            printf("%d ", myRange[i]);
        }
        free(myRange);
    }
    return 0;
}