截断c数组的问题

时间:2011-06-16 05:22:34

标签: c arrays

我声明了一个数组并从用户那里获取输入。现在我想检查重复的条目,它们必须被删除并且应该释放内存。是否可以释放记忆。

释放未使用的内存并减少阵列大小?

我输入了[10,21,3,4,4,2,6,7,21,4,10]。它应该被截断为[10,21,3,4,2,6,7],数组长度现在应该是7,我不想使用排序。

4 个答案:

答案 0 :(得分:4)

在C中,您无法更改数组的大小。如果使用动态分配的内存(使用malloc()),则可以使用realloc()调整内存区域的大小,或者分配新区域,将数据复制到其中并释放旧区域。

通常可接受的解决方案是简单地保留部分数组未使用。这是通过记录在单独的整数变量中使用了多少条目来完成的。

答案 1 :(得分:2)

简单实施:

  1. 如果找到重复的条目,请将数组向左移动以填补空白(覆盖副本)。
  2. 使用realloc减少分配。
  3. 请注意,您根本无法删除任意内存位置。如果填充间隙的运行时是一个问题,请考虑一个替代结构,例如链表,这将允许从中间删除。

    删除重复的条目是另一个问题。一般情况涉及排序。您可能有一个特殊情况,允许更好的行为。

答案 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);

不要忘记检查mallocrealloc是否返回NULL

答案 3 :(得分:0)

数组中的数组不是动态的。也就是说,您可以访问最后一个以外的条目(假设数组变量本质上是指针)。但是,这不安全。

此外,您无法删除“数组条目”。您可以移动其余元素以占据相应的先前位置。但是,您实际上无法删除元素占用的区域,因为数组是连续的内存。