你不能拥有没有价值的记忆。物理上是不可能的。这是由于我们宇宙的物理定律:-)
另外,这个:
Acct clear[0];
是错的。你不能有一个零元素的数组。一些编译器允许它作为扩展,但它不是有效的 C。对于允许它的编译器,它不会做你认为它做的事情。
在我看来,您想要的是调整数组的大小。为此,您需要将要保留的元素复制到一个新数组中,然后 free() 旧数组。为此,您需要dism2A03
使用动态内存进行创建:
Acct *dism2A03 = malloc(sizeof(Acct) * MAX_ENTRY);
if (dism2A03 == NULL) {
// Error: We're out of memory.
}
NULL
(如果没有更多可用内存,malloc() 返回,并且代码会检查这一点。通常,如果发生这种情况,您所能做的就是终止程序。)
当您想要一个删除了一些元素的新数组时,您应该备份当前数组的起始地址:
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
一。但是,从数组中间“删除”某些内容意味着将所有以下元素复制到左侧一个位置:
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
请注意,如果数组为空(即当.),则不应尝试删除元素
还有在数组中间而不是末尾添加新元素的情况。但我希望现在你可以自己解决这个问题,因为它基本上是元素移除案例的反转版本。
另请注意,您可以使用 memcpy() 函数代替在循环中手动逐个复制元素for
,这将更快地进行复制。但是我在这里使用了循环,以便这一切的逻辑更加明显(希望如此。)