如何释放malloc的最后一个元素&x27;C中的d数组?
假设我初始化一个由5个整数元素组成的数组,如下所示:如何释放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,
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));