C 在删除第一个索引中的元素后,如何通过向左移动元素来减小数组的大小?

C 在删除第一个索引中的元素后,如何通过向左移动元素来减小数组的大小?,c,C,我对如何完成这项任务有点困惑 假设我定义了一个大小为5的数组 int array[] = {1, 2, 3, 4, 5}; 然后删除第一个索引中的一个元素,即1 如何将元素向左移动,并将大小缩小1以实现此目的 int array[] = {2, 3, 4, 5}; 现在数组的大小应该是4,也就是说,我不希望最后一个索引4仍然包含5,我希望删除最后一个索引,使数组的大小为4 我有这个代码,并以相反的顺序进行,但我认为这是不对的: for (int i = sizeof(array) - 1;

我对如何完成这项任务有点困惑

假设我定义了一个大小为5的数组

int array[] = {1, 2, 3, 4, 5};
然后删除第一个索引中的一个元素,即1

如何将元素向左移动,并将大小缩小1以实现此目的

int array[] = {2, 3, 4, 5};
现在数组的大小应该是4,也就是说,我不希望最后一个索引4仍然包含5,我希望删除最后一个索引,使数组的大小为4

我有这个代码,并以相反的顺序进行,但我认为这是不对的:

for (int i = sizeof(array) - 1; i >= 0; i--)
{
   array[i-1] = array[i];
}
但我不知道下一步该去哪里


我读了一些关于malloc的文章,但即使在看过代码之后,我也不知道如何使用它。

C根本不允许您这样做,因为数组的大小在运行时是不确定的

数组的内存可以静态分配,也可以自动分配,具体取决于程序的某些细节。静态和自动分配的内存不受运行时变量或更改的“影响”,这可以从C无法执行以下操作中看出:
int breaks[some\u runtime\u variable]

如果您想了解更多关于C中内存分配的信息,以及如何使用动态内存分配解决此问题的一些方法,请参阅我在Quora上的回答:

更具体地说,这是C语言中a的一个玩具实现

从push和pop的实现中可以看到,堆栈作为结构的一个单独字段显式跟踪其当前大小,这允许恒定时间的后进先出推和pop


从技术上讲,当您从堆栈中弹出时,堆栈不会“收缩”,但是如果您将堆栈实现视为一个黑匣子,那么当您弹出时,堆栈可能会收缩,而当您按下时,堆栈可能会增长。

您可以使用realloc()函数refere

您无法调整数组的大小。请使用数组中有意义的条目数来维护一个单独的变量。在循环中使用该值,而不是数组的大小。删除元素时,请减少此计数。更好的是,找到并使用适合问题的数据结构(而不是数组)。根据您在这里提供的描述,您可能正在查找堆栈或队列。@Dekugawaieysu不,您的算法是错误的。想想看,或者在纸上画出来。如果从数组的末尾开始,则用最后一个元素覆盖每个元素。必须从0到数组的大小。而且,
sizeof
操作符的作用与您认为的不同。谷歌
sizeof
在使用它之前。@Dekugawaieysu是的,有点。不过,这并不完全“浪费”内存。你真的不应该担心一个
int
。(尤其是当数组大小有界时,如本例所示。)