[英]Declare large global array
在 C 中聲明大型全局 arrays 的最佳做法是什么? 例如,我想在整個應用程序中使用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.
您可以定義大小:
// 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();
這將在編譯時允許未知大小。 如果在編譯時知道大小,則僅存儲常量將節省計數的開銷。
在 C 中,您需要單獨存儲大小(可能在帶有數組的結構中)。
數組只不過是C中的一塊memory,它不知道數組中有多少項,除了看指針的類型,它甚至不知道數組中單個項的大小* .
如果你真的想使用全局數組,我會推薦這樣的東西:
#define ARRAY_SIZE 1000
char* myArray[ARRAY_SIZE] = {....};
*正如一些人所指出的,這當然不是完全正確的(但仍然是恕我直言編程的好規則)。
我認為這是您正在尋找的解決方案:
// 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;
這取決於它是 static 還是動態數組。 只有當它是一個 static 數組時,你才能使用sizeof()
。
#define MAX_ELE (100)
const static char* MyArray[] = {"str1","str2",....,"str100"}
在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
限定的變量,而不是一個常量表達式,這意味着您不能使用它來執行諸如初始化具有 static 存儲持續時間的對象之類的事情,或者定義非可變修改數組的大小)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.