在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.
答案 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
- 限定变量,而不是常量表达式,这意味着您不能使用它来执行初始化具有静态存储持续时间的对象,或者定义非可变修改数组的大小。)