C-使用指向结构内动态2D数组的指针



我一直在为我的电磁模拟课程编写一件代码,我遇到了一个问题。我决定通过将原始计算扩展到最多10^8个元素的大型网眼来做一些额外的事情,因此现在我必须使用malloc()。

到目前为止,一切都很好,但是由于我更喜欢将代码保留在库中,然后使用编译器的内联选项编译,所以我需要一种方法来传递函数之间的信息。因此,我开始使用structs跟踪网格的参数,以及指向信息数组的指针。我以下方式定义了结构:

typedef struct {
    int    height;
    int    width;
    int    bottom; //position of the bottom node
    unsigned int***  dat_ptr;//the pointer to the array with all the data
    } array_info;

三重指针指向未签名的INT是指向2D数组的指针。我必须这样做,因为否则它是按值传递的,并且我无法从函数中更改它。

现在,当我尝试使用以下功能为结构分配内存时:

void create_array(array_info A)//the function accepts struct of type "array_info" as argument
{
    int i;
    unsigned int** array = malloc(sizeof(*array) * A.height);//creates an array of arrays
    for(i = 0; i<A.height; ++i)
    {
        array[i] = malloc(sizeof(**array) * A.width);//creates an array for each row
    }
    *A.dat_ptr=array;//assigns the position of the array to the input pointer
}

执行操作后,我会得到分段故障。我看不出原因:sizeof(*a.dat_ptr)与sizeof(array)相同。因此,在最坏的情况下,我应该在某个地方的某个地方,而不是在分配行中gibberish,对吗?

您要么需要从函数返回array_info结构(已修改),要么(通常)将指针传递给array_info结构,以使您所做的更改会影响值在调用功能中。

typedef struct
{
    int    height;
    int    width;
    int    bottom;
    unsigned int **dat_ptr;  // Double pointer, not triple pointer
} array_info;
void create_array(array_info *A)
{
    unsigned int **array = malloc(sizeof(*array) * A->height);
    for (int i = 0; i < A->height; ++i)
        array[i] = malloc(sizeof(**array) * A->width);
    A->dat_ptr = array;
}

我假设您在某处进行内存分配进行检查;逻辑位置是此功能。从故障部分恢复是有益的(但如果您要从功能返回而不是从程序中退出,则有必要。

void create_array(array_info *A)
{
    unsigned int **array = malloc(sizeof(*array) * A->height);
    if (array != 0)
    {
        for (int i = 0; i < A->height; ++i)
        {
             if ((array[i] = malloc(sizeof(**array) * A->width)) == 0)
             {
                 for (int j = 0; j < i; j++)
                      free(array[j]);
                 free(array);
                 array = 0;
                 break;
             }
        }
    }
    A->dat_ptr = array;
}

呼叫函数知道,如果dat_ptr成员从create_array()返回时,该函数失败。最好提供成功/失败的回报值。

我正在使用C99,因此调用代码可能是:

array_info array = { .height = 10, .width = 20, .dat_ptr = 0 };
create_array(&array);
if (array->dat_ptr == 0)
    ...error handling...

请注意,create_array()中的代码可能需要检查为无宽度或零宽度或高度的空指针。我不清楚bottom元素应包含的内容,因此我将其放置在非初始化的情况下,这为我提供了使用指定初始化器的一半借口。您也可以在不使用指定初始化器的情况下清楚地编写初始化器。

相关内容

  • 没有找到相关文章

最新更新