Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C] Struktury, allokacja

Ostatnio zmodyfikowano 2015-12-17 18:46
Autor Wiadomość
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ę:
C/C++
typedef struct {
    char * digits;
    int signbit;
    unsigned long long int lastdigit;
} bignum;
w ten sposób:
C/C++
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
P-140037
j23
» 2015-11-12 19:01:16
Możesz też tak:
C/C++
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ć.
P-140041
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?
P-140078
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:
C/C++
typedef struct {
    int signbit;
    unsigned long long int lastdigit;
    char digits[];
} bignum;


bignum * a =( bignum * ) malloc( sizeof( bignum ) + x );
/* i nic więcej nie musisz robić */
P-140082
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?
P-140147
carlosmay
» 2015-11-15 11:41:51
C/C++
char digits[ 1000 ]; // np?
 
P-140149
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ć).
P-140165
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.
P-140168
« 1 » 2
  Strona 1 z 2 Następna strona