2013-06-07 3 views
1

У меня есть массив беззнаковых длинномерных чисел. Я инициализирую первые 12 элементов. Массив изменяет размер во время выполнения программ. Как узнать длину массива.Поиск длины динамически распределенного массива unsigned long long

Я не могу использовать sizeof (array)/sizeof (unsigned long long), так как в этом случае он не работает корректно.

Я попытался с помощью этого цикла:

count = 0; 
while (array[count]) count++; 
return count; 

Проблема этого метода состоит в том, что она по-прежнему возвращает неправильную длину.

Это базовое изложение кода.

unsigned long long *prime = (unsigned long long *)calloc(1000, sizeof(unsigned long long); 
prime[0] = 3; 
prime[1] = 5; 
.... 
prime[11] = 41; 
unsigned long long *ptrEmpty = &prime[12]; 
int sizeComp; 

//User can change change the size of the array here to create a larger list of primes.// 
for(i = 43, sizeComp = 12; sizeComp < length(prime); i += 2){ 
    // Do stuff... 
} 

Как найти эту длину?

+1

Длина массива всегда определяется одним из двух способов: либо указать его в другом месте (в качестве второго параметра), либо просто передать его вместе с массивом, либо вы получите какое-то значение дозорности (традиционно NULL), которое представляет конец списка. Это ваш выбор. –

+0

Возможный дубликат [длина массива в аргументе функции] (http://stackoverflow.com/questions/8269048/length-of-array-in-function-argument) –

ответ

5

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

typedef struct int_arr 
{ 
    int* arr_ptr; 
    size_t max_size; 
    int curr_elem; 
} int_arr; 

Затем вы можете указать init, add и get_max_size и get_curr_size функции.

Init:

int_arr* arr_init(int_arr* ptr, size_t size) 
{ 
    ptr = calloc(size, sizeof(int); 
    ptr->max_size = size; 
    ptr->curr_elem = 0; 
    return ptr; 
} 

Добавить:

void add(int_arr* ptr, int value) 
{ 
    if (ptr->curr_elem < ptr->max_size) 
     ptr->arr_ptr[ptr->curr_elem++] = value; 
    else 
     printf("Max size reached!\n"); 
} 

Получить полный размер:

size_t get_total_size(int_arr* ptr) { return ptr->max_size; } 

Получить текущий размер:

int get_curr_size(int_arr* ptr) { return ptr->curr_elem; } 

Очевидно, замените int на нужный вам тип.

+0

Спасибо. После многого другого поиска в Интернете я понял, что я пытаюсь сделать, это не сработает. Если бы проблема была более сложной, структурный подход был бы способом пойти. Поскольку все, что я делаю, заполняет массив списком простых чисел, я просто перейду с переменной длины, которая будет установлена ​​одновременно с изменением размера массива. Я обязательно сохраню это обозначение, чтобы вернуться к нему, поскольку я больше узнаю о C. – user1362058

+0

Рад, что я был хоть какой-то помощью, лично я считаю, что это хороший способ обеспечить некоторую проверку (например, проверку границ) в противном случае очень легко злоупотреблять языком :) Удачи! – Nobilis

Смежные вопросы