2013-05-25 3 views
1

Может ли кто-нибудь помочь мне с этим? Скажем, у меня есть следующая структура:Сохранение длины динамического массива структуры

typedef struct mystruct{ 
    int data1; 
    int data2; 
}mystruct; 

И я создал массив структур, используя следующий код:

main(void) { 
    mystruct **new_mystruct = function(); 
    ... need to know the length of new_mystruct here ... 
} 

mystruct **function(){ 
    ... code to determine length of array here ... 
    mystruct **new_mystruct= malloc(length_of_array * sizeof(mystruct)); 
    ... code to fill array here ... 
    return new_mystruct; 
} 

Что такое лучший способ вернуть длину моего массива, предполагая length_of_array динамически генерируется в течение времени выполнения моей функции?

Надеюсь, у меня есть смысл. Заранее спасибо.

+0

Вы объявляете двойной указатель, но выделяете только для 'mystruct'. Снимите одну из звездочек. –

+0

Просто поместите NULL в последний элемент. Затем вы можете сделать некоторое время, чтобы подсчитать, сколько у вас элем. – Maresh

+0

Кажется, что * связанный список * будет одним из вариантов. –

ответ

2

Вы могли бы передать длину в качестве ссылки на функции, и есть функция заполнить его:

mystruct *function(size_t *size) 
{ 
    /* ... */ 

    mystruct *new_mystruct = malloc(length_of_array * sizeof(mystruct)) 
    *size = length_of_array; 

    /* ... */ 

    return new_mystruct; 
} 

int main(void) 
{ 
    /* ... */ 

    size_t size; 
    mystruct *new_mystruct = function(&size); 

    /* ... */ 
} 
+0

Это метод, который я использую, поскольку он является самым простым. – chaser

0
size_t function(MyStruct *mystruct) 
{ 
    /*...*/ 
    mystruct = malloc(length_of_array * sizeof(MyStruct)); 
    /*...*/ 
    return length_of_array; 
} 

и использовать

MyArray *new_array; 
size_t lenght; 

lenght = function(new_array); 
0

Вы можете либо вернуться на структуру (или указатель на struct), который содержит как длину, так и указатель на выделенный массив, или вы можете передать указатель на переменную, чтобы получить длину.

int length; 

mystruct **new_mystruct = function(&length); 

Я предпочитаю подход, основанный на принципе stuct.

2

Сделать обертку структура:

typedef struct_array_ 
{ 
    mystruct * p; 
    size_t size; 
} struct_array; 

Ваша функция создания может вернуть это по значению:

struct_array create_array(size_t n) 
{ 
    mystruct * p = malloc(n * sizeof *p); 
    struct_array result = { p, n }; 
    return result; 
} 

Вы должны сделать соответствующую очистку функции:

void destroy_array(struct_array a) 
{ 
    free(a.p); 
} 

Вы можете также создайте функцию copy_array, которая использует memcpy для создания копия.

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