#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 如何删除零?
答案 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 ,事情就会非常错误!
如果您想重新分配数组,最好还是阅读malloc
,realloc
和free
。在此期间,除了一些关于C的基础教程之外,由于你对预处理器(#define
&#39; d变量)的误解,你很可能只是从C开始。