我如何删除typedef结构的数组?

时间:2013-07-27 13:16:52

标签: c data-structures struct

我正在尝试删除一组初始化的结构,例如重置数组

我的结构:

   struct entry{
        char name[NAME_SIZE];
        int mark;
    };

    typedef struct entry Acct;
    Acct dism2A03[MAX_ENTRY];
    Acct clear[0];        << temp struct to set original struct to null

我的尝试:

entry_total跟踪struct array dism2A03[x]中有多少结构体设置了值。

我尝试创建一个相同结构clear[0]的空数组。循环遍历dism2A03[x]中的初始化数组并将其设置为clear[0]

       for(m=0;m<entry_total;m++){
            dism2A03[m]=clear[0];           
        }
        break;

然而,它将它们设置为0,我希望它们变得未初始化,例如其中没有值

2 个答案:

答案 0 :(得分:2)

你不能拥有没有价值的记忆。这在身体上是不可能的。这是由于我们宇宙的物理定律: - )

另外,这个:

Acct clear[0];

错了。您不能拥有零元素的数组。有些编译器会将此作为扩展,但它不是有效的C.对于允许这样做的编译器,它不会按照您的想法执行。

在我看来,你想要的是调整阵列的大小。要做到这一点,你需要将要保留的元素复制到一个新数组中,然后释放旧的数组。为此,您需要使用动态内存创建dism2A03

Acct *dism2A03 = malloc(sizeof(Acct) * MAX_ENTRY);
if (dism2A03 == NULL) {
    // Error: We're out of memory.
}

(如果没有更多可用内存,malloc()返回NULL,代码会检查。通常,如果发生这种情况,你可以做的就是终止程序。)

当你想要一个删除了一些元素的新数组时,你应该备份当前的数组的起始地址:

Acct* oldArray = dism2A03;

然后使用您想要的新尺寸创建一个新的:

dism2A03 = malloc(sizeof(Acct) * NEW_SIZE);
if (dism2A03 == NULL) {
    // Error: We're out of memory.
}

将您想要的元素从旧数组(oldArray)复制到新数组(dism2A03) - 这取决于您,我不知道您要保留哪些元素 - 以及之后你必须释放旧阵列:

free(oldArray);

作为最后一点,您可能根本不想创建新数组。相反,你可以保持原始的,静态分配的数组(“静态分配”意味着你没有使用malloc()):

Acct dism2A03[MAX_ENTRY];

并有一个索引变量,您可以在其中跟踪该数组中实际有多少有用元素。起初,有0:

size_t dism2A03_size = 0;

在向该数组添加元素时,可以在dism2A03_size

给出的位置执行此操作
dism2A03[dism2A03_size] = <something>
++dism2A03_size; // Now there's one more in there, so remember that.

在执行此操作时,您需要确保dism2A03_size不会大于数组的最大容量,在您的情况下为MAX_ENTRY。所以上面会变成:

if (dism2A03_size < MAX_SIZE) {
    dism2A03[dism2A03_size] = <something>
    ++dism2A03_size; // Now there's one more in there, so remember that.
} else {
    // Error: the array is full.
}

正如您所看到的,在数组末尾添加内容非常简单。从数组末尾删除内容同样简单;你只需将dism2A03_size减1。但是,从数组中间“删除”某些东西意味着将所有后续元素复制到左侧的一个位置:

for (size_t i = elem_to_remove + 1; i < dism2A03_size; ++i) {
    dism2A03[i - 1] = dism2A03[i];
}
--dism2A03_size; // Remember the new size, since we removed one.

请注意,如果数组为空(表示dism2A03_size == 0时,则不应尝试删除元素。)

还有一种情况是在数组中间而不是在结尾处添加新元素。但我希望你现在可以自己解决这个问题,因为它基本上是元素删除案例的逆转版本。

另请注意,不是在for循环中逐个手动复制元素,而是可以使用memcpy()函数,这样可以更快地进行复制。但是我在这里使用循环,以便它的逻辑更明显(希望如此。)

答案 1 :(得分:0)

以这种方式声明数组Acct dism2A03[MAX_ENTRY];时,数组在堆栈中分配,因此当函数执行return语句时,它将被删除。

您可以做的是通过malloc/calloc在堆中分配结构,然后您可以通过free函数释放该内存区域。

例如:

 typedef struct entry Acct;
  Acct * dism2A03 = calloc(MAX_ENTRY, sizeof( struct entry));
 // ....
  free(dism2A03);