PDA

Visualizza la versione completa : [C]puntatoreApuntatore e arraydiPuntatori , problema


toni00t
04-05-2014, 21:32
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



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



SI


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



NO


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



grazie

minomic
04-05-2014, 22:02
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:



#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;
}



:ciauz:

oregon
04-05-2014, 23:13
Il problema in questa linea

char **str="pippo";

Osservala con attenzione ...

toni00t
05-05-2014, 09:58
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?

oregon
05-05-2014, 10:50
No.

"pippo" non "un puntatore a puntatore a char" ma rappresenta un semplice puntatore a char.

toni00t
05-05-2014, 12:23
No.

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

oregon
05-05-2014, 12:30
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 ...

minomic
05-05-2014, 14:14
Ciao,
stavo seguendo la discussione e sinceramene anche io non capisco. Credevo che str dichiarato come


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:



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

:ciauz:


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

minomic
05-05-2014, 14:28
Una possibile versione "ridotta" del codice sopra riportato potrebbe essere la seguente:



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

:ciauz:

oregon
05-05-2014, 14:30
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

Loading