Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何释放malloc的最后一个元素&x27;C中的d数组?_C_Arrays_Malloc_Free - Fatal编程技术网

如何释放malloc的最后一个元素&x27;C中的d数组?

如何释放malloc的最后一个元素&x27;C中的d数组?,c,arrays,malloc,free,C,Arrays,Malloc,Free,假设我初始化一个由5个整数元素组成的数组,如下所示: int *Q = malloc(sizeof(int) * 5); for (int i = 0; i < 5; i++) { Q[i] = i; } 数组看起来像:{1,2,3,4,#},其中#是一些垃圾值 有没有办法释放最后一个元素,使其不存储在数组中 我试过这个: free(Q[4]); 但我知道这是行不通的,因为free()只能操作分配给Q的整个内存块 有没有更好的方法来改变一切?生成的数组应该如下所示:{1,2,

假设我初始化一个由5个整数元素组成的数组,如下所示:

int *Q = malloc(sizeof(int) * 5);

for (int i = 0; i < 5; i++) {
    Q[i] = i;
}
数组看起来像:{1,2,3,4,#},其中#是一些垃圾值

有没有办法释放最后一个元素,使其不存储在数组中

我试过这个:

free(Q[4]);
但我知道这是行不通的,因为free()只能操作分配给Q的整个内存块

有没有更好的方法来改变一切?生成的数组应该如下所示:{1,2,3,4}

每次轮班后使用realloc()Q是个好主意吗?

realloc()
可以更改分配内存块的大小,这将为您完成任务。请注意,这不能用于“释放”数组中的任意元素,而只能在最后释放一个元素

这样做有多好取决于许多因素,但您没有提供任何一个因素。

realloc()
可以更改分配内存块的大小,这将为您完成任务。请注意,这不能用于“释放”数组中的任意元素,而只能在最后释放一个元素


这样做的好与坏取决于许多因素,但您没有提供任何一个因素。

了解您肯定可以使用的数组的最后一个元素

顺便说一句,当你说

数组看起来像:{1,2,3,4,#},其中#是一些垃圾值

您是错误的,并且您正在调用未定义的行为,正如所解释的


所以左移位值不必做的循环
Q[4]=Q[5]

标记您肯定可以使用的数组的最后一个元素

顺便说一句,当你说

数组看起来像:{1,2,3,4,#},其中#是一些垃圾值

您是错误的,并且您正在调用未定义的行为,正如所解释的


所以左移位值不必做的循环
Q[4]=Q[5]

执行Q++时,数组没有更改,它仍然包含五个值0、1、2、3、4。只是Q指向数组中的第二个元素

如果您想更改已分配内存的大小,请按照Scott所说的操作,并
realloc
block,但这是一种处理堆内存的昂贵方法

如果您只想跟踪数组中的元素数,那么让Q保持指向第一个元素,并使用一个size变量指示有多少个整数


或者使用另一个数据结构保存整数,例如整数的链接列表,这样可以更轻松地添加和删除整数。

当您执行Q++时,数组没有更改,它仍然包含五个值0,1,2,3,4。只是Q指向数组中的第二个元素

如果您想更改已分配内存的大小,请按照Scott所说的操作,并
realloc
block,但这是一种处理堆内存的昂贵方法

如果您只想跟踪数组中的元素数,那么让Q保持指向第一个元素,并使用一个size变量指示有多少个整数


或者,使用另一种数据结构保存整数,例如整数的链接列表,这样可以更轻松地添加和删除整数。

要在数组中的元素之间移动,可以使用
memmove()


要在数组中移动元素,可以使用
memmove()


如果你正在做一个
Q++
你没有移动数组的元素,那么你的数组只是指向第二个元素(索引1)。因此,Q[4]读取的内容不属于数组:C允许您这样做(在大多数情况下),但这是一个错误

要移动元素,您应该执行以下操作之一

for (int i=0; i<4; i++)
    Q[i] = Q[i+1];
但事实上,要有一个大小为4的数组,您必须realloc


但是如果您需要这样做,可能数组不是您应该使用的数据结构:链表似乎是更好的选择。

如果您正在执行
Q++
操作,您没有移动数组的元素,那么您的数组只是指向第二个元素(索引1)。因此,Q[4]读取的内容不属于数组:C允许您这样做(在大多数情况下),但这是一个错误

要移动元素,您应该执行以下操作之一

for (int i=0; i<4; i++)
    Q[i] = Q[i+1];
但事实上,要有一个大小为4的数组,您必须realloc


但是如果您需要这样做,可能数组不是您应该使用的数据结构:链表似乎是一个更好的选择。

是的,如果您需要调整
Q++
,而不是调整
大小--
。你有一块内存,你可以控制如何访问它。在
Q++
之后,
Q[4]
不包含“垃圾”。访问它是未定义的。您可以使用。如果它只是一个元素,那么它是否值得工作是值得怀疑的,这样做很可能不会释放任何内存。您可能应该提供更多上下文。这听起来像是一个XY问题(),你到底想做什么?是的,如果你做了
Q++
,那么调整
大小--
。你有一块内存,你可以控制如何访问它。在
Q++
之后,
Q[4]
不包含“垃圾”。访问它是未定义的。您可以使用。如果它只是一个元素,那么它是否值得工作是值得怀疑的,这样做很可能不会释放任何内存。您可能应该提供更多上下文。这听起来像是一个XY问题(),你到底想做什么?
0 1 2 3 4
1 2 3 4 4
1 2 1 2 3
for (int i=0; i<4; i++)
    Q[i] = Q[i+1];
memmove(Q, Q+1, 4*sizeof(int));