【问题标题】:Clearing an array in C [closed]在C中清除数组[关闭]
【发布时间】:2020-03-14 17:47:43
【问题描述】:

我有一个结构,其中有一个数字数组。我想擦除数组的所有内容,然后释放分配的内存。我该怎么做?

【问题讨论】:

  • this question可以解决你的问题吗?
  • 发布你的代码比仅仅描述它更好。

标签: c arrays memory


【解决方案1】:

如果您要释放一些分配的内存,则无需“清除”它。以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 是数组中的成员数量。

【讨论】:

    【解决方案2】:

    您需要向我们展示结构类型的定义以及如何分配它,但我会尝试涵盖所有基础:

    首先,在 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-&gt;arr

    如果结构成员只是一个指针,您将malloccalloc的结果分配给,例如

    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
    

    【讨论】:

      【解决方案3】:

      你可以这样写: struct.arrayname[i] = 0; 在一个 for 循环中。 据我所知,只要使用结构中的数据类型,它们就不会占用内存。希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-10-12
        • 1970-01-01
        • 1970-01-01
        • 2010-12-20
        • 1970-01-01
        • 1970-01-01
        • 2021-10-24
        相关资源
        最近更新 更多