Объявить большой глобальный массив - PullRequest
8 голосов
/ 29 июня 2011

Какова наилучшая практика для объявления больших глобальных массивов в 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 ]

6 голосов
/ 29 июня 2011

Вы можете определить размер:

// 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();

Это позволило бы неизвестный размер во время компиляции. Если размер известен во время компиляции, просто сохранение константы сэкономит затраты на подсчет.

2 голосов
/ 29 июня 2011

В C вам нужно хранить размер отдельно (возможно, в структуре с массивом).

Массив - это не что иное, как блок памяти в C, он не знает, сколько элементов в массиве, и, кроме того, глядя на тип указателя, он даже не знает размер одного элемента. в массиве *.

Если вы действительно хотите использовать глобальный массив, я бы порекомендовал что-то вроде этого:

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

* Как отмечали некоторые люди, это не совсем верно (конечно, это хорошее правило для программирования с помощью imho).

1 голос
/ 29 июня 2011

Я думаю, что это решение, которое вы ищете:

// 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;
0 голосов
/ 29 июня 2011

В 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 -качественной переменной, а не константным выражением, что означает, что вы не можете использовать ее для таких вещей, как инициализация объектов со статической длительностью хранения или определение размера неизменяемых массивов).

0 голосов
/ 29 июня 2011

Это зависит от того, является ли это статическим или динамическим массивом. * Только если это статический массив, вы можете использовать sizeof().

#define MAX_ELE (100)
const static char* MyArray[] = {"str1","str2",....,"str100"}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...