我的函数原型应如下所示:
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++;
}
}
答案 0 :(得分:4)
好的,让我们发现错误:
void double_min_max(int **range, int min, int max)
{
range = (int **)malloc(sizeof(int)* 10);
使用malloc的演员是不必要的,甚至可以lead to problems。不要这样做。
然后您要分配到*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);
答案 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;
}