马洛克双指针



我的函数原型应该看起来像这样:

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

好的,让我们找出错误:

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

用malloc石膏是不必要的,甚至可能导致问题。别这样。

然后你想分配给*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);

使用**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;
}

最新更新