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

Dynamiczna tablica wskaźniów

Ostatnio zmodyfikowano 2019-07-03 00:33
Autor Wiadomość
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:


C/C++
#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)


C/C++
#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;
}

P-174874
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:
Przekazujesz do funkcjiZmiany widoczne na zewnątrz
char
brak
char *
char
char **
char *
char ***
char **
P-174876
pekfos
» 2019-07-03 00:00:13
C/C++
char ** tab;

x( tab );
Dlaczego nie tak?
C/C++
char ** tab = x();
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).
P-174881
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

C/C++
#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]=► .


P-174882
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 ]
.
P-174883
aksen
Temat założony przez niniejszego użytkownika
» 2019-07-03 00:33:30
Dzięki, teraz jest OK.
P-174884
« 1 »
  Strona 1 z 1