通过成员为动态数组的函数初始化结构
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->array1
或st->array2
甚至使用st
的值的行为。没有理由期望检查 st->array1
或 st->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);
。
非常感谢您的帮助和详细的回答:)以上是关于通过成员为动态数组的函数初始化结构的主要内容,如果未能解决你的问题,请参考以下文章