如何删除数组中未使用的空间

时间:2018-02-11 11:09:57

标签: c

#define n 10
int a[n];

我想全局声明一个数组并修改其他函数的大小

int main(){ 
  int b;
  printf("Enter the number of elements\n");
  scanf("%d",&b);
  #undef n
  #define n b
  for(int i = 0;i < n; i++)
    scanf("%d",&a[i]);
  display();
}

我修改了主函数

中的大小
void display()
{
  for(int i=0;i<n;i++)
  printf("%d ",a[i]);
}

当我输入大小为5并输入元素1 2 3 4 5 输出显示5个元素,后跟5个零1 2 3 4 5 0 0 0 0 0 如何删除零?

2 个答案:

答案 0 :(得分:3)

你做不到。声明数组后,无法更改其大小。作为替代方案,您可以使用指针完美地模拟此行为,然后动态分配内存并将块地址分配给此指针。然后,您可以realloc内存来合并此大小更改。

这将是: -

size_t sz = 10;
int *arr = malloc(sizeof *arr * sz); // sizeof(*arr)*sz (sizeof is operator)
if(!arr){
   perror("malloc");
   exit(1);
}
...
sz/=2; //correcting the size
int *p =realloc(arr,sizeof *arr * sz); 
if(!p){
   perror("realloc");
   exit(1);
}
arr = p;
...
free(arr);

宏也不是运行时的东西 - 它在编译时被扩展。而且你需要在运行时调整数组大小而不是编译时间。否则,您可以在编写代码时从一开始就将数组大小设置为该大小。这就是为什么宏不能在这里工作

注意arr这里不是一个数组 - 它是一个指向已分配内存的指针(使用malloc创建的内存块的起始地址) 。没有其他的。

答案 1 :(得分:0)

您所做的只是更改预处理器常量。它们在编译时进行评估,因此您的重新定义实际上是毫无意义的,并且不起作用。

不确定您在此处尝试实现的目标,因为此阵列不会重新分配。如果您想要限制您正在迭代的条目数量,请放弃n并将其替换为:

static const size_t n = 10;
static size_t num_entries = n;

然后你应该做

,而不是重新定义n
num_entries = b;

以后再使用它来遍历数组。但是,请注意,这不会重新分配数组,因此如果b大于n ,事情就会非常错误!

如果您想重新分配数组,最好还是阅读mallocreallocfree。在此期间,除了一些关于C的基础教程之外,由于你对预处理器(#define&#39; d变量)的误解,你很可能只是从C开始。