首页 > 解决方案 > 通过成员为动态数组的函数初始化结构

问题描述

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

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;
}

我究竟做错了什么?

标签: cpointersstructinitializationmalloc

解决方案


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

要记录指针不再指向有效内存,您可以NULL在调用 之后将指针设置为自己free,如下所示:

free(st);
st = NULL;

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


推荐阅读