簡體   English   中英

聲明大型全局數組

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM