通过成员为动态数组的函数初始化结构
Initialising struct through a function whose members are dynamic arrays
我有以下结构定义(名称已被概括):
typedef struct structure{
int *array1;
int *array2;
} structure_t;
我需要通过一个将两个数组的大小作为参数的函数来初始化这个结构数据结构。函数 return 是指向该数据结构的指针,失败时为 NULL。
我对如何解决这个问题感到困惑。我知道我不能 return 本地声明的结构的指针,我也知道我需要为两个成员 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
不会改变传递给它的指针的值。它不能,因为它只接收值而不是对指针的引用。
要记录一个指针不再指向有效内存,你可以在调用free
后自己将指针设置为NULL
,如:
free(st);
st = NULL;
此外,一旦 st
指向的内存被释放,C 标准没有定义访问 st->array1
或 st->array2
甚至使用 st
完全没有。没有理由期望检查 st->array1
或 st->array2
的空指针会产生任何特定结果。比较可能会评估为真,可能会评估为假,可能会导致您的程序中止,或者可能会导致您的程序以其他方式出现异常。
我有以下结构定义(名称已被概括):
typedef struct structure{
int *array1;
int *array2;
} structure_t;
我需要通过一个将两个数组的大小作为参数的函数来初始化这个结构数据结构。函数 return 是指向该数据结构的指针,失败时为 NULL。
我对如何解决这个问题感到困惑。我知道我不能 return 本地声明的结构的指针,我也知道我需要为两个成员 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
不会改变传递给它的指针的值。它不能,因为它只接收值而不是对指针的引用。
要记录一个指针不再指向有效内存,你可以在调用free
后自己将指针设置为NULL
,如:
free(st);
st = NULL;
此外,一旦 st
指向的内存被释放,C 标准没有定义访问 st->array1
或 st->array2
甚至使用 st
完全没有。没有理由期望检查 st->array1
或 st->array2
的空指针会产生任何特定结果。比较可能会评估为真,可能会评估为假,可能会导致您的程序中止,或者可能会导致您的程序以其他方式出现异常。