声明大型全局数组

时间:2011-06-29 00:51:35

标签: c arrays

在C中声明大型全局数组的最佳做法是什么?例如,我想在整个应用程序中使用myArray。但是,如果我这样做,我将失去sizeof()的使用:

// file.c
char* myArray[] = { "str1", "str2", ... "str100" };

//file.h
extern char* myArray[];


// other_file.c
#include "file.h"
size_t num_elements = sizeof( myArray ); // Can determine size of incomplete type.

5 个答案:

答案 0 :(得分:5)

您可以定义尺寸:

// file.c
char *myArray[100] = { "str1", "str2", ... "str100" };

// file.h
extern char *myArray[100];

然后sizeof应该有效,但您也可以只#define大小或设置变量。

另一种选择是计算长度并将其存储在代码中......

// file.c
char *myArray[] = { "str1", "str2", ... "strN", (char *) 0 };
int myArraySize = -1;
int getMyArraySize() {
   if( myArraySize < 0 ) {
      for( myArraySize = 0; myArray[myArraySize]; ++myArraySize );
   }
   return myArraySize;
 }


// file.h
extern char *myArray[];
int getMyArraySize();

这将在编译时允许未知大小。如果在编译时知道大小,那么只存储常量将节省计数的开销。

答案 1 :(得分:2)

在C中,您需要单独存储大小(可能在带有数组的结构中)。

数组只不过是C中的一块内存,它不知道数组中有多少项,除了查看指针的类型外,它甚至不知道单个项的大小在数组 *

如果你真的想要使用全局数组,那么我会推荐这样的东西:

#define ARRAY_SIZE 1000
char* myArray[ARRAY_SIZE] = {....};

* 正如有些人所指出的那样,这并不完全正确(但仍然是imho编程的好规则)。

答案 2 :(得分:1)

我认为这是您正在寻找的解决方案:

// file.c
char* myArray[] = { "str1", "str2", ... "str100" };
const size_t sizeof_myArray = sizeof myArray;

//file.h
extern char* myArray[];
extern const size_t sizeof_myArray;

答案 3 :(得分:0)

这取决于它是静态数组还是动态数组。只有当它是静态数组时才能使用sizeof()

#define MAX_ELE (100)
const static char* MyArray[] = {"str1","str2",....,"str100"}

答案 4 :(得分:0)

file.h中,您可以输入:

#include <stddef.h>

extern char *myArray[];
extern const size_t myArray_len;

然后在file.c中,你有:

#include "file.h"

char *myArray[] = { "str1", "str2", ... "str100" };
const size_t myArray_len = sizeof myArray / sizeof myArray[0];

这样你的其他模块可以引用myArray_len,你不需要在任何地方明确地写出数组的大小。

(缺点是myArray_len仅仅是const - 限定变量,而不是常量表达式,这意味着您不能使用它来执行初始化具有静态存储持续时间的对象,或者定义非可变修改数组的大小。)