2013-04-08 4 views
1

Я на самом деле работает на присваивания в C, и для нуждающихся в моей реализации, мне нужно использовать статический массив, скажемC - Статический массив с длиной, определяемой переменной

static int array[LEN]; 

т. е. эта длина массива, LEN, вычисляется в main(). Например

static int LEN; 

void initLen(int len) { 
LEN = len; 
} 

static int array[LEN]; 

Где initLen вызывается в main и len вычисляются с использованием аргументов, заданных пользователем.

Проблема с этой конструкции является то, что я получаю ошибку

threadpool.c:84: error: variably modified ‘isdone’ at file scope 

ошибка происходит из-за того, что мы не можем инициализировать статические массивы, используя переменные, как длина. Для того, чтобы заставить его работать, я определяю LEN_MAX и написать

#define LEN_MAX 2400 

static int array[LEN_MAX] 

Вопрос с этой конструкции является то, что я хочу подвергать себя для буферов переполнения и ошибки сегментации :(

Так что я интересно, если есть некоторый элегантный способ инициализировать статический массив с точной длиной LEN?

Спасибо заранее!

+0

Что такое 'isdone' и что он должен делать с вашим массивом? Нигде в вашем вопросе, кроме сообщения об ошибке, упоминается эта переменная 'isdone'. Пожалуйста, предоставьте [SSCCE] (http://sscce.org/). –

+0

@JoachimPileborg well 'isdone' - это просто реальный массив в моей программе, массив, который я просто назвал' array' в моем примере. – HappyRave

ответ

6
static int LEN; 
static int* array = NULL; 

int main(int argc, char** argv) 
{ 
    LEN = someComputedValue; 
    array = malloc(sizeof(int) * LEN); 
    memset(array, 0, sizeof(int) * LEN); 
    // You can do the above two lines of code in one shot with calloc() 
    // array = calloc(LEN, sizeof(int)); 
    if (array == NULL) 
    { 
     printf("Memory error!\n"); 
     return -1; 
    } 
    .... 
    // When you're done, free() the memory to avoid memory leaks 
    free(array); 
    array = NULL; 
+0

Это замечательно! : D Интересно, почему я не думал о указателях! Спасибо! – HappyRave

+0

Никто не ожидает Испанской инквизиции, э-э, я имею в виду указатели! –

+0

Если 'malloc' не удается, я думаю, вы должны вернуть статус ошибки. – effeffe

1

Я предлагаю использовать malloc:

static int *array; 

void initArray(int len) { 
    if ((array = malloc(sizeof(int)*len)) != NULL) { 
     printf("Allocated %d bytes of memory\n", sizeof(int)*len); 
    } else { 
     printf("Memory error! Could not allocate the %d bytes requested!\n", sizeof(int)*len); 
    } 
} 

Теперь не забудьте инициализировать массив, прежде чем использовать его.