【问题标题】:Allocate 2D array分配二维数组
【发布时间】:2020-09-05 18:31:58
【问题描述】:

我在这个练习中有一个段错误。

说明:

• 编写一个 ft_ultimate_range 函数来分配和分配一个 int 数组。这个 int 表将包含 min 和 max 之间的所有值。
• 包含最小值 - 排除最大值。
• 如果最小值大于或等于最大值,则范围将指向 NULL。
• 将返回范围大小(或在出现问题时返回 0)。

#include <stdlib.h>
#include <stdio.h>

int ft_ultimate_range(int **range, int min ,int max)
{
    int len;
    int i;

    i = 0;
    len = max - min;
    if (min >= max)
    {
        *range = NULL;
        return(0);
    }

    **range = (int)malloc(sizeof(int) * len);
    while (min < max)
    {
        range[0][i] = min;
        i++;
        min++;
    }
    return(len);
}

int main()
{
    int min;
    int max;
    int **range = NULL;

    min = 0;
    max = 10;
    printf("%d\n", ft_ultimate_range(range, min, max));
    return(0);
}

【问题讨论】:

标签: c multidimensional-array malloc


【解决方案1】:
**range = (int)malloc(sizeof(int) * len);

当我编译你的代码时,这一行会引发警告:

警告:从指针转换为不同大小的整数 [-Wpointer-to-int-cast]

永远不要忽略来自编译器的警告。

malloc函数返回一个指针,为什么要把它转换成int值?

你想要二维数组,但我似乎是矩阵1 x len,它是一维数组(向量)。

好的,忘记二维或一维数组(向量)。如果你想在你的代码中使用双指针,你必须先分配它。

// this line should be in main function
range = malloc(sizeof(int *));
if(!range) {
   return -1;
}
// this line before while loop
range[0] = malloc(sizeof(int)*len);
if(!range[0]) {
   return -1;
}

如果你想要一个矩阵“M*N”,你可以分配指针如下:

// allocate double pointer
range = malloc(sizeof(int *)*M);
if(!range) {
   return -1;
}

// then using a loop to allocate the pointers:
for(int i = 0; i<N; i++) {
   range[i] = malloc(sizeof(int)*N);
   if(!range[i]) {
     return -1;
   }
}

不要忘记在不需要使用时释放指针(free(range[i] 然后free(range))。

【讨论】:

    【解决方案2】:

    正如你所猜测的那样,你的分配是错误的

    通过写作

    **range = (int)malloc(sizeof(int) * len);
    

    您的意思是分配给范围的取消引用(NULL)的取消引用

    范围 = NULL *range = 偏移量 0 处的任何值 **range = 从地址 0 读取的值到该地址的任何值

    请阅读this 以编写分配器

    归结为:

    array = malloc( sizeof(int[rows][cols]) );
    

    但在您的情况下,您希望将数组作为 ref var 的传递返回

    int main() {
        int **array;
        ft_ultimate_range(&array)
    }
    
    int ft_ultimate_range(int ***array) {
       *array = malloc( sizeof(int[rows][cols]) );
    }
    

    但是

    您的代码有点不使用完整的二维数组,并且函数没有返回它:

        while (min < max)
        {
            range[0][i] = min;
            i++;
            min++;
        }
    

    你在这里只使用了一行,之后甚至没有使用range中的数据,人们会认为代码无关紧要,因为你只返回len

    【讨论】:

    • 他们并不真正想要一个二维数组,只是一个指向一维数组的指针。最初,他们想要一个int * 来指向数据的存储位置,然后他们需要一个int **,以便函数可以将int * 传回。 range[0][i] 只是(*range)[i] 的一种写法。
    • 作者代码的意图令人困惑,可能正在进行中,只是占位符循环
    • 不,我们最近在另一个问题中看到了这一点。这些学生正在做一项作业,要求他们通过 int ** 参数返回一个“int”数组。
    • 感谢@EricPostpischil 的见解
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多