在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.
Run Code Online (Sandbox Code Playgroud)
您可以定义大小:
// file.c
char *myArray[100] = { "str1", "str2", ... "str100" };
// file.h
extern char *myArray[100];
Run Code Online (Sandbox Code Playgroud)
这样就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();
Run Code Online (Sandbox Code Playgroud)
这将允许在编译时使用未知大小。如果在编译时知道大小,则仅存储常数将节省计数开销。
在 C 中,您需要单独存储大小(可能在带有数组的结构中)。
数组无非就是C中的一块内存,它不知道数组中有多少项,除了查看指针的类型外,它甚至不知道数组中单个项的大小*。
如果你真的想使用全局数组,那么我会推荐这样的东西:
#define ARRAY_SIZE 1000
char* myArray[ARRAY_SIZE] = {....};
Run Code Online (Sandbox Code Playgroud)
*正如一些人指出的那样,这当然不完全正确(但恕我直言,这仍然是一个很好的编程规则)。