C-Objective Temat założony przez niniejszego użytkownika |
[C] Struktury, allokacja » 2015-11-12 16:59:41 Witam. Jeśli alokuję tą strukturę: typedef struct { char * digits; int signbit; unsigned long long int lastdigit; } bignum;
w ten sposób: bignum * a =( bignum * ) malloc( sizeof( bignum ) );
to czy muszę allokować pole tak: n->digits=calloc(x, sizeof(char)); Skoro chcę zaalokować i to i to |
|
j23 |
» 2015-11-12 19:01:16 Możesz też tak: bignum * a =( bignum * ) malloc( sizeof( bignum ) + x );
a->digits =( char * ) a + sizeof( bignum ); co jest o tyle wygodniejsze, że nie musisz zwalniać pamięci spod digits, wystarczy zwolnić a. To rozwiązanie jest złe jeśli digits będzie się zmieniać. |
|
C-Objective Temat założony przez niniejszego użytkownika |
» 2015-11-13 17:23:08 Będzie się zmieniać, nie napisałem przed zmienną CONST. Lepsze rozwiązanie? |
|
j23 |
» 2015-11-13 18:29:49 Może źle się wyraziłem. Miałem na myśli, że takie rozwiązanie będzie złe, jeśli adres pamięci wskazywanej przez digits będzie zmieniany w trakcie działania programu (bo np. okaże się, że trzeba więcej miejsca). Jeśli adres nie będzie zmieniany, to rozwiązanie jest jak najbardziej ok. W przeciwnym wypadku musisz oddzielnie przydzielić pamięć dla struktury i oddzielnie dla digits. I tak samo musisz dwa razy użyć free, żeby zwolnić pamięć. W przypadku, który zaproponowałem można nieco przerobić strukturę, dzięki czemu znikną niejednoznaczności: typedef struct { int signbit; unsigned long long int lastdigit; char digits[]; } bignum;
bignum * a =( bignum * ) malloc( sizeof( bignum ) + x );
|
|
C-Objective Temat założony przez niniejszego użytkownika |
» 2015-11-15 11:28:03 A jak określić rozmiar digits :)? np 1000 elementów? |
|
carlosmay |
» 2015-11-15 11:41:51 |
|
j23 |
» 2015-11-15 13:58:09 @C-Objective: nie wiem, jak, bo nie wiem, czym to digits u Ciebie jest (mogę się tylko domyślać). |
|
C-Objective Temat założony przez niniejszego użytkownika |
» 2015-11-15 15:12:10 Rozmiaru nie znam w czasie kompilacji. Dopiero w czasie wykonania programu, no błagam... Digits to tablica liczby. np: bigint a = { "27462659", 0, 8 }; Czy BigInt, i digits nie mówi ci niczego ?? Jakbym znał w czasie kompilacji rozmiar, tego pytania by nie było. |
|
« 1 » 2 |