如何定义一个全局数组(获取另一个函数的长度)?

时间:2017-11-21 13:00:50

标签: c arrays data-structures global-variables

如何编写一个具有全局数组的C代码,该数组将main()的长度作为用户输入?

我尝试了很多不同的方法,但到目前为止还没有一种方法,例如:

#include <stdio.h>

const int length;
int array[length];

int main()
{
    scanf("%d",&length);
}

4 个答案:

答案 0 :(得分:6)

参考您的代码,我可以指出:

int array[length];

这当然不起作用,因为在编译时,array的大小是未知的。您无法静态定义具有无限期(从编译期间编译器的角度来看)大小的数组!
如果你想决定数组运行时的大小(即动态),你不能通过以你的方式声明变量来做到这一点。

此外,将constlength一起使用将无效。摆脱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;
}

我假设您的数组长度适合整数范围,或相应地更改。