Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 19
  1. #1
    Utente di HTML.it
    Registrato dal
    Aug 2012
    Messaggi
    91

    [C]puntatoreApuntatore e arraydiPuntatori , problema

    ciao mi è venuto un dubbio veniale sui puntatori :
    un array di puntatori dovrebbe essere equivalente a un puntatore a puntatore , eccetto
    che quest'ultimo è read only :

    ho provato ad accedere al loro contenuto , ma se nei primi due casi tutto funziona
    nel terzo esempio ottengo sempre core dump : qualcuno mi può aiutare ?
    non vorrei dire sciocchezze ,ma ho il sospetto che che compile-time e run-time centrino qualcosa..

    SI

    codice:
    main(int argc , char **argv)
    {
    ...
    printf ("%s" , argv[1]) ;
    }

    SI
    codice:
    main(int argc , char *[]argv)
    {
    ...
    printf ("%s" , argv[1]) ;
    }

    NO
    codice:
    int main()
    {
    char **str="pippo";
    printf ("%s" , str[1]) ;//coredump
    printf ("%s" , *str) ;//core dump
    }

    grazie

  2. #2
    Utente di HTML.it L'avatar di minomic
    Registrato dal
    Nov 2010
    Messaggi
    635
    Ciao,
    premetto che non sono del tutto sicuro che il codice che ti posto sia corretto, quindi prendilo con il beneficio del dubbio e insieme aspettiamo conferme dagli utenti più esperti.
    Comunque dovrebbe funzionare:

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    
    int main()
    {
        char **str = (char **) malloc(3*sizeof(char *));        // alloco un array di stringhe
        str[0] = (char *) malloc(10*sizeof(char));               // alloco una stringa di 10 caratteri
        str[0][0]='p';          // inserisco i caratteri della stringa
        str[0][1]='i';
        str[0][2]='p';
        str[0][3]='p';
        str[0][4]='o';
        str[0][5]='\0';         // il terminatore della stringa
        printf("%s\n", str[0]); // stampo la stringa passando il primo puntatore dell'array di puntatori
        return 0;
    }


  3. #3
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Il problema è in questa linea

    char**str="pippo";

    Osservala con attenzione ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  4. #4
    Utente di HTML.it
    Registrato dal
    Aug 2012
    Messaggi
    91
    Quote Originariamente inviata da oregon Visualizza il messaggio
    Il problema è in questa linea

    char**str="pippo";

    Osservala con attenzione ...
    ciao , è un puntatore a puntatore a stringa :
    dovrebbe essere equivalente al char **argv del main , al quale passiamo gli argomenti da linea di comando no?

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    No.

    "pippo" non è "un puntatore a puntatore a char" ma rappresenta un semplice puntatore a char.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  6. #6
    Utente di HTML.it
    Registrato dal
    Aug 2012
    Messaggi
    91
    Quote Originariamente inviata da oregon Visualizza il messaggio
    No.

    "pippo" non è "un puntatore a puntatore a char" ma rappresenta un semplice puntatore a char.
    perchè dici ? c'è un doppio riferimento.non capisco

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Perché dico cosa?

    "pippo" è un array di caratteri (costante) e viene rappresentato tramite il puntatore al primo carattere in memoria. Non ha nulla a che vedere con un puntatore ad un array di puntatori.

    Non hai chiaro il concetto di puntatore, è per questo che non comprendi adesso ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  8. #8
    Utente di HTML.it L'avatar di minomic
    Registrato dal
    Nov 2010
    Messaggi
    635
    Ciao,
    stavo seguendo la discussione e sinceramene anche io non capisco. Credevo che str dichiarato come

    codice:
    char **str;

    fosse equivalente a un array di array di char, quindi a un array di stringhe.

    Infatti questo codice funziona e stampa tre stringhe:

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    
    int main()
    {
        char **str = (char **) malloc(3*sizeof(char *));        // alloco un array di stringhe
        str[0] = (char *) malloc(10*sizeof(char));               // alloco una stringa di 10 caratteri
        str[1] = (char *) malloc(10*sizeof(char));
        str[2] = (char *) malloc(10*sizeof(char));
    
    
        str[0][0]='p';          // inserisco i caratteri della stringa
        str[0][1]='i';
        str[0][2]='p';
        str[0][3]='p';
        str[0][4]='o';
        str[0][5]='\0';         // il terminatore della stringa
    
    
        str[1][0]='p';          // inserisco i caratteri della stringa
        str[1][1]='l';
        str[1][2]='u';
        str[1][3]='t';
        str[1][4]='o';
        str[1][5]='\0';         // il terminatore della stringa
    
    
        str[2][0]='t';          // inserisco i caratteri della stringa
        str[2][1]='o';
        str[2][2]='p';
        str[2][3]='o';
        str[2][4]='l';
        str[2][5]='i';
        str[2][6]='n';
        str[2][7]='o';
        str[2][8]='\0';         // il terminatore della stringa
    
    
        printf("%s\n", str[0]); // stampo la stringa passando il primo puntatore dell'array di puntatori
        printf("%s\n", str[1]);
        printf("%s\n", str[2]);
        return 0;
    }

    C'è qualche problema?
    Grazie.




    EDIT - Penso di aver capito: non avevo letto bene.
    @toni00t: se ho capito bene oregon non ti sta "contestando" il fatto che str sia un array di stringhe, ma il fatto che tu lo abbia inizializzato uguale a "pippo" che è una stringa (cioè un array di caratteri).
    Ultima modifica di minomic; 05-05-2014 a 14:20

  9. #9
    Utente di HTML.it L'avatar di minomic
    Registrato dal
    Nov 2010
    Messaggi
    635
    Una possibile versione "ridotta" del codice sopra riportato potrebbe essere la seguente:

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    
    int main()
    {
        char **str = (char **) malloc(3*sizeof(char *));        // alloco un array di stringhe
        str[0] = (char *) malloc(10*sizeof(char));               // alloco una stringa di 10 caratteri
        str[1] = (char *) malloc(10*sizeof(char));
        str[2] = (char *) malloc(10*sizeof(char));
    
    
        strcpy(str[0], "pippo");
        strcpy(str[1], "pluto");
        strcpy(str[2], "topolino");
    
    
        printf("%s\n", str[0]); // stampo la stringa passando il primo puntatore dell'array di puntatori
        printf("%s\n", str[1]);
        printf("%s\n", str[2]);
        return 0;
    }

    @oregon: è corretto? Mi interessa soprattutto la parte di allocazione dinamica della memoria.
    @toni00t: se oregon conferma che il codice è corretto, puoi tenerlo presente per vedere come allocare e gestire un array di array di char, quindi un array di stringhe.


  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Hai capito bene ...

    Se dici che una certa cosa è di un certo tipo (puntatore a puntatore a char) e poi gli assegni un'altra roba (un semplice puntatore a char) ovviamente avrai problemi ...

    Ma mi sembrava ovvio dato che parliamo di tutta una linea

    char **str="pippo";

    e non solo di

    char **str
    No MP tecnici (non rispondo nemmeno!), usa il forum.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.