aksen Temat założony przez niniejszego użytkownika |
Dynamiczna tablica wskaźniów » 2019-07-02 21:32:27 mamy taki kod (kod jest w C a nie C++): char** tab; jest globalna wszystko wykonuje się ok: #include <stdio.h> #include <string.h> #include <stdlib.h>
char ** tab;
void x( void ) { tab =( char ** ) malloc( 2 * sizeof( char * ) ); tab[ 0 ] =( char * ) malloc( 10 * sizeof( char ) ); tab[ 1 ] =( char * ) malloc( 10 * sizeof( char ) ); sprintf( tab[ 1 ], "%s", "test1" ); printf( "1. tab[1]=%s\n", tab[ 1 ] ); }
int main() { x(); printf( "2. tab[1]=%s\n", tab[ 1 ] ); return 0; }
teraz przenosimy char** tab; do main: kod kompiluje się, ale program nie wykonuje się poprawnie co trzeba poprawić? (pomijając oczywiste zwalnianie pamięci przez free) #include <stdio.h> #include <string.h> #include <stdlib.h>
void x( char ** tab ) { tab =( char ** ) malloc( 2 * sizeof( char * ) ); tab[ 0 ] =( char * ) malloc( 10 * sizeof( char ) ); tab[ 1 ] =( char * ) malloc( 10 * sizeof( char ) ); sprintf( tab[ 1 ], "%s", "test1" ); printf( "1. tab[1]=%s\n", tab[ 1 ] ); }
int main() { char ** tab; x( tab ); printf( "2. tab[1]=%s\n", tab[ 1 ] ); return 0; }
|
|
jankowalski25 |
» 2019-07-02 22:45:46 Za mało gwiazdek. Przekazujesz tablicę, więc main() nic nie wie o tym, że wewnątrz x() alokujesz pamięć na tablicę. Przekaż adres tablicy, wtedy taka zmiana będzie widoczna po wyjściu z x(). Jeszcze dorzucę tabelkę, żeby to było jasne: |
|
pekfos |
» 2019-07-03 00:00:13 Dlaczego nie tak? Jeśli koniecznie chcesz przez argument, pamiętaj że w C zawsze argumenty są przekazywane przez wartość, więc możesz napisać x(tab), jak również x(tab+1). tab+1 nie jest poprawnym celem przypisania, bo nie musi być - liczy się tylko wartość. Dlatego żeby zmodyfikować zewnętrzną zmienną w funkcji, chcesz przekazać jej adres, tak by funkcja mogła pod ten adres wpisać odpowiednią wartość, więc x(&tab). |
|
aksen Temat założony przez niniejszego użytkownika |
» 2019-07-03 00:19:03 zmieniłem, ale dalej gdzieś jest błąd/błędy #include <stdio.h> #include <string.h> #include <stdlib.h>
void x( char *** t ) { * t =( char ** ) malloc( 2 * sizeof( char * ) ); printf( "p1a. *t=%p\n", * t ); * t[ 0 ] =( char * ) malloc( 10 * sizeof( char ) ); * t[ 1 ] =( char * ) malloc( 10 * sizeof( char ) ); printf( "p2a. *t[1]=%p\n", * t[ 1 ] ); sprintf( * t[ 1 ], "%s", "test1" ); printf( "p3a. *t[1]=%s\n", * t[ 1 ] ); }
int main() { char ** tab; x( & tab ); printf( "\np1b. t=%p\n", tab ); printf( "p2b. t[1]=%p\n", tab[ 1 ] ); printf( "p3b. t[1]=%s\n", tab[ 1 ] ); return 0; }
wynik: p1a równe p1b, a reszta już się nie zgadza p1a. *t=0000000000565FB0 p2a. *t[1]=00000000002EFEF0 p3a. *t[1]=test1
p1b. t=0000000000565FB0 p2b. t[1]=0000000000560158 p3b. t[1]=► .
|
|
jankowalski25 |
» 2019-07-03 00:29:22 Teraz z kolei chodzi o priorytety operatorów. Dołóż więcej nawiasów, bo * tablica[ indeks ] nie jest tym samym, co ( * tablica )[ indeks ] . |
|
aksen Temat założony przez niniejszego użytkownika |
» 2019-07-03 00:33:30 Dzięki, teraz jest OK. |
|
« 1 » |