| 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 |