繁体   English   中英

在全局范围内声明动态大小的数组

[英]Declare dynamically sized array in global scope

经常不使用C,我遇到了一个可能很简单的问题。 我有几个函数,需要访问全局数组变量g 但是这个变量的实际大小必须在init()函数中定义。 大小取决于其他一些东西,所以g必须以动态大小以某种方式声明。 我读了关于malloc和其他功能,但我不确定如何正确使用它们。

例:

double g[dynamic]; // size is not known yet
int n;

void init()
{
   // calculate "n" for array size
   n = ...
   // declare and initialze g with a size "n"
}

void dostuff()
{
   for (int i = 0; i < n; i++)
      work(g[i]);
}

我该怎么解决这个问题?

你不能使用数组 你必须使用指针

double *global_array; // size is not known yet
size_t nglobal_array; // may be helpful to have the size

void init(void)
{
   // calculate "nglobal_array" for array size
   nglobal_array = 42;
   // declare and initialze global_array with a size "nglobal_array"
   global_array = malloc(nglobal_array * sizeof *global_array);
   if (global_array == NULL) {
       fprintf(stderr, "Error allocating resources.\nProgram aborted.\n");
       exit(EXIT_FAILURE);
   }
}

void dostuff()
{
   for (int i = 0; i < nglobal_array; i++)
      work(global_array[i]);
}

当你不再需要它时,别忘了free(global_array)

完全使用将是这样的

#include <stdlib.h>
// includes
// declarations & definitions as above
int main(void) {
    init();
    dostuff();
    free(global_array);
}

你不想在C中实现什么目标。

全局数组在编译时必须具有固定大小,或者至少在链接时具有固定大小。

您可以声明没有指定大小的数组:

extern double g[];

但它必须在实际大小的某处定义,从定义位置的常量表达式计算,并且无法从上面的声明中确定大小,因此必须以其他方式传递给将使用该数组的函数:隐式地,使用表示数组末尾的特殊值(如char字符串的'\\0' )或显式通过您发布的单独变量。 但请注意, ng是全局变量的非常差的名称选择,因为它们可能与局部变量名冲突,并且对读者没有任何意义。

如果直到运行时才知道大小,则应定义指针而不是数组,并定义一个单独的变量,该变量具有将由初始化函数分配的数组的长度。

double *g;
size_t g_length;

不,C不这样做。 在全局范围内声明的数组在二进制文件中为它们分配了固定空间(Windows上的.EXE文件和Linux上的ELF可执行文件)。 如果需要动态大小的数组,则需要动态分配它。 示例在这里:

#include <stdlib.h>
#define ARRAY_SIZE 100
typedef char T; //your type here
T* array;

void init() {
    array = malloc(sizeof(T) * ARRAY_SIZE); //array filled with garbage values
    //array = calloc(ARRAY_SIZE, sizeof(T)); //array filled with 0x00
}
void finish() {
    free(array); // DO NOT ACCESS ARRAY AFTER THIS CALL!
}
int main() {
    init();
    array[6] = 63; //access array as normal
    finish();
    //array[41] = 23; //will most likely crash due to a segmentation fault, also called an access violation on Windoez
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM