通过成员为动态数组的函数初始化结构

Posted

技术标签:

【中文标题】通过成员为动态数组的函数初始化结构【英文标题】:Initialising struct through a function whose members are dynamic arrays 【发布时间】:2021-03-25 04:06:28 【问题描述】:

我有以下结构定义(名称已被概括):

typedef struct structure
    int *array1;
    int *array2;
 structure_t;

我需要通过一个函数来初始化这个结构数据结构,该函数将两个数组的大小作为参数。该函数返回一个指向该数据结构的指针,失败时返回 NULL。

我对如何解决这个问题感到困惑。我知道我不能返回本地声明的结构的指针,而且我也知道我需要为两个成员 array1 和 array2 动态分配内存,因为在编译时不知道大小(它是由这个用户输入的)。我尝试了以下方法:

structure_t* init(int size1, int size2)

    structure_t *st = malloc(sizeof (structure_t));

    if(st == NULL) return NULL;

    st->array1 = malloc((sizeof (int))*size1);
    st->array2 = malloc((sizeof (int))*size2);

    return st;

我已经检查过了,一切都在初始化。但是当我释放内存时,它无法正常工作,因为只有指向 array1 的指针被更改为 NULL。

bool destroy(strcuture_t *st)

    free(st->array1);
    free(st->array2);
    free(st);

    if (st == NULL)
        return true;
    else
        return false;

我做错了什么?

【问题讨论】:

free() 不会,而且无法更改您传递给它的指针的值。 【参考方案1】:

free 不会更改传递给它的指针的值。它不能,因为它只接收值而不是指针的引用。

要记录一个指针不再指向有效内存,可以在调用free后自己设置指针指向NULL,如下:

free(st);
st = NULL;

此外,一旦st 指向的内存被释放,C 标准根本没有定义访问st->array1st->array2 甚至使用st 的值的行为。没有理由期望检查 st->array1st->array2 的空指针会产生任何特定的结果。比较可能评估为真,可能评估为假,可能导致您的程序中止,或可能导致您的程序在其他方面行为不端。

【讨论】:

非常感谢!这非常有帮助,我已经用你的替换了我的 destroy 函数中的代码并刚刚返回 true(它必须返回一个 bool,因为这是为了学校的事情,我们必须坚持给定的函数原型)。另外,只是为了确认一下,我的提示是正确的,对吧? @MariahZammit:初始化对我来说看起来是正确的。但是,最好将structure_t *st = malloc(sizeof (structure_t)); 更改为structure_t *st = malloc(sizeof *st);,因为这会根据分配的对象而不是第二次键入类型来确定大小。这减少了输入错误(例如在 structB_t 的位置使用 structA_t)并在 st 的类型发生更改时自动调整。同样,其他赋值应该是st->array1 = malloc(size1 * sizeof *st->array1);st->array2 = malloc(size2 * sizeof *st->array2); 非常感谢您的帮助和详细的回答:)

以上是关于通过成员为动态数组的函数初始化结构的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中初始化动态二维数组

如何初始化动态对象数组

为包含动态数组的结构创建 MPI 类型

如何复制动态分配的对象(具有一个类的 const 成员)

动态数组的实现(c语言)----数据结构

如何在 C++ 中初始化指向动态二维数组的指针 [关闭]