我声明了一个数组并从用户那里获取输入。现在我想检查重复的条目,它们必须被删除并且应该释放内存。是否可以释放记忆。
释放未使用的内存并减少阵列大小?
我输入了[10,21,3,4,4,2,6,7,21,4,10]
。它应该被截断为[10,21,3,4,2,6,7]
,数组长度现在应该是7,我不想使用排序。
答案 0 :(得分:4)
在C中,您无法更改数组的大小。如果使用动态分配的内存(使用malloc()
),则可以使用realloc()
调整内存区域的大小,或者分配新区域,将数据复制到其中并释放旧区域。
通常可接受的解决方案是简单地保留部分数组未使用。这是通过记录在单独的整数变量中使用了多少条目来完成的。
答案 1 :(得分:2)
简单实施:
realloc
减少分配。请注意,您根本无法删除任意内存位置。如果填充间隙的运行时是一个问题,请考虑一个替代结构,例如链表,这将允许从中间删除。
删除重复的条目是另一个问题。一般情况涉及排序。您可能有一个特殊情况,允许更好的行为。
答案 2 :(得分:1)
我声明了一个长度为100的数组并从用户那里获取了输入
所以你的意思是这样的:
int input[100];
/* - ask 100 input from user */
是否可以释放内存
答案是否定的,因为你静态分配了100个整数。
如果你想减少记忆,你应该这样做:
int *tempBuffer=malloc(100*sizeof(int)); /* dynamic allocation */
for(i=0;i<100;++i) scanf("%d",&tempBuffer[i]);/* - ask 100 input from user */
int uniqueN=10 /* - assume the first 10 entries are the unique entries */
int *realBuffer=malloc(uniqueN*sizeof(int)); /* - allocate new buffer just enough for the unique entries */
for(i=0;i<uniqueN;++i) realBuffer[i]=tempBuffer[i]; /* - copy the unique entries from input to the final buffer */
free(tempBuffer); /* - tempBuffer is now unused, free it */
/* here we have realBuffer with just enough size, no unused memory */
在将第一个realloc
条目安排为唯一条目后,另一个解决方案是tempBuffer
uniqueN
:
realloc(tempBuffer,uniqueN);
不要忘记检查malloc
或realloc
是否返回NULL
答案 3 :(得分:0)
数组中的数组不是动态的。也就是说,您可以访问最后一个以外的条目(假设数组变量本质上是指针)。但是,这不安全。
此外,您无法删除“数组条目”。您可以移动其余元素以占据相应的先前位置。但是,您实际上无法删除元素占用的区域,因为数组是连续的内存。