我正在尝试删除一组初始化的结构,例如重置数组
我的结构:
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,我希望它们变得未初始化,例如其中没有值
答案 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);