如何编写一个具有全局数组的C代码,该数组将main()的长度作为用户输入?
我尝试了很多不同的方法,但到目前为止还没有一种方法,例如:
#include <stdio.h>
const int length;
int array[length];
int main()
{
scanf("%d",&length);
}
答案 0 :(得分:6)
参考您的代码,我可以指出:
int array[length];
这当然不起作用,因为在编译时,array
的大小是未知的。您无法静态定义具有无限期(从编译期间编译器的角度来看)大小的数组!
如果你想决定数组运行时的大小(即动态),你不能通过以你的方式声明变量来做到这一点。
此外,将const
与length
一起使用将无效。摆脱const
。
您可以而且应该做的是,使用int
指针,并获取动态分配的内存的起始地址。
您可以使用malloc
功能。
我不会为你编写整个代码,但它应该包含类似于此的代码:
int *ptr = malloc(length * sizeof(int));
从这里开始,如果用户输入了10(例如length
= 10),和,如果malloc
没有返回NULL
,那么你应该能够从存储在ptr
指针中的地址开始存储多达10个整数,当然也可以通过递增指针ptr
来访问它们。
如果您阅读malloc
的任何手册页,您应该能够处理所需的头文件。我不是在写你需要的文件,因为我希望你自己阅读手册页和代码。
答案 1 :(得分:3)
你显然不能。当length
得到它的值时,你是否期望内存分配神奇地在时间上倒退,追溯?
这不是C的工作原理,它并不那么抽象。
你必须使数组只是一个指针(然后你可以在需要时声明extern
),并将长度作为一个单独的变量,也是extern
。
答案 2 :(得分:0)
在文件范围(在任何函数体外部)声明的数组具有static
存储持续时间,这意味着在程序启动之前,在执行任何语句之前,它们的空间就会被分配。因此,必须在编译时知道它们的大小。
如果要分配全局可见但未在运行时调整大小的内存,则必须使用动态内存分配。
#include <stdio.h>
#include <stdlib.h>
int *array; // personally, I would name these something like
size_t length; // g_array and g_length to emphasize their "global-ness"
// and disambiguate them from any local variables.
int main( void )
{
// get length value somehow
array = malloc( sizeof *array * length );
if ( !array )
{
// Could not allocate memory, handle as appropriate
}
// do stuff with array
free( array );
return 0;
}
答案 3 :(得分:-1)
您需要使用malloc创建动态数组来解决问题,如下所示。
#include<stdio.h>
#include<stdlib.h>
int *array;
main()
{
int length;
scanf("%d",&length);
array = (int *)malloc (length*sizeof(int));
// array[0] = 100;
}
我假设您的数组长度适合整数范围,或相应地更改。