c - 通过成员为动态数组的函数初始化结构
问题描述
我有以下结构定义(名称已被概括):
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
不会更改传递给它的指针的值。它不能,因为它只接收值而不是指针的引用。
要记录指针不再指向有效内存,您可以NULL
在调用 之后将指针设置为自己free
,如下所示:
free(st);
st = NULL;
此外,一旦 指向的内存st
被释放,C 标准根本没有定义访问st->array1
甚至st->array2
使用值的行为st
。没有理由期望检查st->array1
或st->array2
空指针会产生任何特定的结果。比较可能评估为真,可能评估为假,可能导致您的程序中止,或者可能导致您的程序以其他方式行为不端。
推荐阅读
- c++ - 将新元素插入/放置到 unordered_map/unordered_set 时的提示
- google-apps-script - 复制工作表,副本放在原件旁边
- c# - 在避免内存泄漏和悬空套接字的同时,执行许多并行 Web 请求的最佳方式是什么?(C#)
- tableau-api - 如何根据特定年份检索字段的总和(例如:2018 减去 1 = 2017)?
- docker - 放置 Docker 应用程序使用的文件夹和文件的位置
- c# - 向 Ajax.BeginForm 发送失败的正确方法是什么?
- asp.net - 在 web api 中托管 webform 页面。CS0103 控件在当前上下文中不存在
- sharepoint-online - 使用 SPS 查找列时如何使用查找?
- angular - 当将托管在子文件夹中时,如何构建 Angular 5 项目?
- java - 在 linux 上运行 java 应用程序