0

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

我的结构:

   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跟踪结构数组dism2A03[x]中有多少结构在其中设置了值。

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

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

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

4

2 回答 2

1

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

另外,这个:

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,这将更快地进行复制。但是我在这里使用了循环,以便这一切的逻辑更加明显(希望如此。)

于 2013-07-27T13:32:37.677 回答
0

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

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

例如 :

 typedef struct entry Acct;
  Acct * dism2A03 = calloc(MAX_ENTRY, sizeof( struct entry));
 // ....
  free(dism2A03); 
于 2013-07-27T13:30:49.143 回答