【发布时间】:2020-03-14 17:47:43
【问题描述】:
我有一个结构,其中有一个数字数组。我想擦除数组的所有内容,然后释放分配的内存。我该怎么做?
【问题讨论】:
-
this question可以解决你的问题吗?
-
发布你的代码比仅仅描述它更好。
我有一个结构,其中有一个数字数组。我想擦除数组的所有内容,然后释放分配的内存。我该怎么做?
【问题讨论】:
如果您要释放一些分配的内存,则无需“清除”它。以struct为例:
typedef struct my_struct {
int * my_numbers;
// other fields
} my_struct_t;
你描述的释放内存的方法如下:
my_struct_t bar;
bar.my_numbers = malloc(...);
// do some stuff with your struct
free(bar.my_numbers);
但既然您在问题中提到它,“清零”或“清除”动态分配的数组的最佳方法可能是来自<string.h> 的标准memset 函数:
memset(bar.my_numbers, 0, N * sizeof(int));
N 是数组中的成员数量。
【讨论】:
您需要向我们展示结构类型的定义以及如何分配它,但我会尝试涵盖所有基础:
首先,在 C 中“擦除”数组内容通常意味着用带外值覆盖元素(例如,对于只应该包含非负元素的 int 数组,你会覆盖带有0 的元素,或者对于指针数组,您将用NULL 覆盖所有元素)。
如果要将数组元素中的所有字节设置为0,可以像这样使用memset库函数:
memset( arr, 0, sizeof arr );
否则,您将需要编写一个循环:
for ( size_t i = 0; i < num_elements( arr ); i++ )
arr[i] = some_default_value;
其中num_elements( arr ) 只是该数组中元素的数量,您必须以某种方式对其进行跟踪。
如果你在结构体定义中将数组定义为fixed-size数组,比如
struct foo {
...
int arr[10];
...
};
那么您不能调整数组的大小,也不能将数组的内存与整个结构实例分开释放。 IOW,如果您将实例分配为
struct foo obj;
那么你不能手动释放内存。如果你把它分配为
struct foo *obj = malloc( sizeof *obj );
那么你不能独立于obj 来释放obj->arr。
如果结构成员只是一个指针,您将malloc或calloc的结果分配给,例如
struct foo {
...
int *arr;
...
};
struct foo obj;
obj.arr = malloc( sizeof *obj.arr * 10 );
那么你可以调整数组的大小:
int *tmp = realloc( obj.arr, sizeof *obj.arr * 20 );
if ( tmp )
obj.arr = tmp;
并从结构实例中单独释放它:
free( obj.arr );
如果你动态分配结构实例,那么它只会变得更复杂一点:
struct foo *obj = malloc( sizeof *obj );
if ( !obj )
// memory error, bail out here
obj->arr = malloc( sizeof *obj->arr * 10 );
if ( !obj->arr )
{
free( obj ); // release partially-allocated memory first
// bail out here
}
// do stuff with obj
free( obj->arr ); // release arr first
free( obj ); // release obj
【讨论】:
你可以这样写: struct.arrayname[i] = 0; 在一个 for 循环中。 据我所知,只要使用结构中的数据类型,它们就不会占用内存。希望这会有所帮助。
【讨论】: