我的函数原型应该看起来像这样:
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
,而不是range
。range
是函数的本地(所有参数都按 C 中的值传递(,因此修改它永远不会对调用代码产生任何可见的影响。调用此函数时,应将指针传递给指针,以便函数可以通过*range
修改指针。
最后,这应该是显而易见的,但您应该从min
和max
中计算所需的大小。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;
}