|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Jul 2000
Città: Vignola (MO)
Messaggi: 316
|
[C] Errore su array di puntatori
Sto imarando a usare i C ma come tutti in novellini ho dei problemi con gli array di puntatori...
Come prima cosa copio l'indirizzo dell'indice di un array in un altro poi provo a far ciclare il nuovo array per stampare il valore appena copiato ma l'ultimo valore mi va in Segmentation fault... anche diminuendo il numero di cicli ma va in errore Codice:
#include <stdio.h> #include <stdlib.h> void copy_array(); void copy_struct(); int main(int argc, char **argv) { copy_array(); printf("-------------------\n"); copy_struct(); return 0; } void copy_array() { char** array1; char** array2; int i; array1 = (char**)malloc( sizeof(char) * 20); array2 = (char**)malloc( sizeof(char) * 20); for (i = 0; i < 20; i++) { array1[i] = "prova"; //array1[i] = strcpy(array1[i],array2[i]); array2[i] = (array1[i]); printf("%d %s\n",i); } for (i = 0; i < 20; i++) { printf("%d %s\n",i ,array2[i]); } free(array1); free(array2); } void copy_struct() { typedef struct { int i; char* array[]; } stru; stru* array1; stru* array2; int i; array1 = (stru*)malloc( sizeof(stru) + (sizeof(char)* 20)); array2 = (stru*)malloc( sizeof(stru) + (sizeof(char)* 20)); for (i = 0; i < 20; i++) { array1->array[i] = "prova1"; //array1[i] = strcpy(array1[i],array2[i]); array2->array[i] = (array1->array[i]); } for (i = 0; i < 20; i++) { printf("%d %s\n",i ,array2->array[i]); } free(array1); free(array2); } Buon anno
__________________
<Asus A8N-E Deluxe> <Amd64 3000+> <Ram 2.5 Gb> <Geffo3> <2 Maxtor 160 Gb RAID 1> <Adsl ZyXEL 645r> <ESS Maestro> <GNU/Linux Debian Etch> ![]() Wii 1037 4238 6261 1967 |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9569
|
innanzitutto buon anno!!!
per quanto riguarda il tuo problema direi che in copy_array() hai sbagliato a fare la malloc. se tu dichiari char **a; quello è un puntatore di puntatore che serve per realizzare un array di stringhe. facendo come hai scritto tu a1= (char **) malloc (sizeof(char)*20); è sbagliato perchè allochi spazio per 20 caratteri e non 20 puntatori a caratteri e poi casti a puntatore di puntatore. direi che si dovrebbe correggere in questo modo: a1= (char **) malloc (sizeof(char *)*20); in questo modo allochi spazio per 20 stringhe, ora però devi allocare spazio per ogni stringa, così for (i=0; i<20; ++i) a1[i]= (char *) malloc (sizeof(char)*15); in questo modo a1 è un array di stringhe composte da 15 caratteri. per quanto riguarda la copy_struct() ora non ti posso aiutare sono ancora troppo intontito... ![]() |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9569
|
ecco la versione funzionante del tuo programma. cmq ho anch'io una domanda da fare. la struttura stru contine un array di puntatori a caratteri di dimensione non fissata. ma proprio perchè la dimensione non è fissata, non si dovrebbe fare anche un
array1->array= (char **) malloc (sizeof(char)*n)?? Codice:
#include <stdio.h> #include <stdlib.h> void copy_array(); void copy_struct(); int main(int argc, char **argv) { copy_array(); printf("-------------------\n"); copy_struct(); system("pause"); return 0; } void copy_array() { char** array1; char** array2; int i; array1 = (char**) malloc (sizeof(char *) * 20); array2 = (char**) malloc (sizeof(char *) * 20); for (i = 0; i < 20; i++) { array1[i]= (char *) malloc (sizeof(char)*20); array2[i]= (char *) malloc (sizeof(char)*20); array1[i] = "prova"; //array1[i] = strcpy(array1[i],array2[i]); array2[i] = (array1[i]); printf("%d %s\n",i, array1[i]); } for (i = 0; i < 20; i++) { printf("%d %s\n",i ,array2[i]); } free(array1); free(array2); } void copy_struct() { typedef struct { int i; char* array[]; } stru; stru* array1; stru* array2; int i; array1 = (stru*) malloc (sizeof(stru)); array2 = (stru*) malloc (sizeof(stru)); //array1->array= (char **) malloc (sizeof(char)*20); //array2->array= (char **) malloc (sizeof(char)*20); for (i = 0; i < 20; i++) { array1->array[i]= (char *) malloc (sizeof(char)*20); array2->array[i]= (char *) malloc (sizeof(char)*20); array1->array[i] = "prova1"; //array1[i] = strcpy(array1[i],array2[i]); array2->array[i] = array1->array[i]; } for (i = 0; i < 20; i++) { printf("%d %s\n",i ,array2->array[i]); } free(array1); free(array2); } |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Jul 2000
Città: Vignola (MO)
Messaggi: 316
|
Esatto grazie funziona!!!!
Per quanto riguarda la tua domanda... Pensavo che: Codice:
char* pippo= "pippo"; char** pippo1; pippo1 = pippo; Stavo provando a fare una mappa (stile Hashtable di Java) e ho utilizzato un principio simile al programmino che ti ho fatto vedere, per adesso funziona ( ![]() Se vuoi ti invio il codice Grazie per la tua cortesia Ciao a presto
__________________
<Asus A8N-E Deluxe> <Amd64 3000+> <Ram 2.5 Gb> <Geffo3> <2 Maxtor 160 Gb RAID 1> <Adsl ZyXEL 645r> <ESS Maestro> <GNU/Linux Debian Etch> ![]() Wii 1037 4238 6261 1967 |
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
char* pippo= "pippo";
char** pippo1; pippo1 = pippo; Le istruzioni sono sbagliate... Le stringhe non si dichiarano in quel modo ma così: char pippo[]= "pippo"; pippo1 = pippo; E' un assegnamento sbagliato... Un assegnamento valido è: pippo1 = &pippo; Ma bisogna anche vedere il senso che vuoi dargli... |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Jul 2000
Città: Vignola (MO)
Messaggi: 316
|
Hai ragione ma il mio compilatore (gcc 3.3.4) mi da un warming quando scrivo
Codice:
char* str1; char str[]="prova"; str1 = &str; printf("%s \n", str1); Codice:
char* str1; char str[]="prova"; str1 = str; printf("%s \n", str1); ![]() Grazie ciao
__________________
<Asus A8N-E Deluxe> <Amd64 3000+> <Ram 2.5 Gb> <Geffo3> <2 Maxtor 160 Gb RAID 1> <Adsl ZyXEL 645r> <ESS Maestro> <GNU/Linux Debian Etch> ![]() Wii 1037 4238 6261 1967 |
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Appunto...nel codice sopra avevi dichiarato
char ** str1; L'assegnazione senza dereference va bene nell'ultimo codice che hai postato... |
![]() |
![]() |
![]() |
#8 | |
Senior Member
Iscritto dal: Oct 2002
Città: Roma
Messaggi: 1502
|
Quote:
perche non si puo diacharare una stringa cosi: char* pippo= "pippo"; ?
__________________
Sun Certified Java Programmer EUCIP Core Level Certified European Certification of Informatics Professionals |
|
![]() |
![]() |
![]() |
#9 | |
Senior Member
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9569
|
Quote:
|
|
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Jul 2000
Città: Vignola (MO)
Messaggi: 316
|
Avrei un'altra domanda.
Che differenze ci sono nelle seguenti dichiarazioni? Codice:
typedef struct { int i; char* array[]; } my_str; typedef struct { int i; char* array[0]; } my_str; typedef struct { int i; char** array; } my_str;
__________________
<Asus A8N-E Deluxe> <Amd64 3000+> <Ram 2.5 Gb> <Geffo3> <2 Maxtor 160 Gb RAID 1> <Adsl ZyXEL 645r> <ESS Maestro> <GNU/Linux Debian Etch> ![]() Wii 1037 4238 6261 1967 |
![]() |
![]() |
![]() |
#11 | |
Senior Member
Iscritto dal: Oct 2002
Città: Roma
Messaggi: 1502
|
Quote:
__________________
Sun Certified Java Programmer EUCIP Core Level Certified European Certification of Informatics Professionals |
|
![]() |
![]() |
![]() |
#12 | ||
Senior Member
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9569
|
Quote:
![]() Quote:
|
||
![]() |
![]() |
![]() |
#13 | |
Senior Member
Iscritto dal: Oct 2002
Città: Roma
Messaggi: 1502
|
Quote:
__________________
Sun Certified Java Programmer EUCIP Core Level Certified European Certification of Informatics Professionals |
|
![]() |
![]() |
![]() |
#14 | |
Senior Member
Iscritto dal: Oct 2002
Città: Roma
Messaggi: 1502
|
Quote:
__________________
Sun Certified Java Programmer EUCIP Core Level Certified European Certification of Informatics Professionals |
|
![]() |
![]() |
![]() |
#15 | |
Senior Member
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9569
|
Quote:
char* array[]; quanti lmenti può contner quell'array? di sicuro non uno visto che s compili il programma in qull'array vengono contnute 20 stringhe. |
|
![]() |
![]() |
![]() |
#16 | |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
Nel modo sopra la zona di memoria puntata da pippo può essere modificata con un semplice assegnamento...e quindi poterbbe creare notevoli problemi...spesso molto difficili da scovare... char pippo[] = "pippo"; Inizializzando così si ha un errore in caso si cerchi di assegnare un altro indirizzo al puntatore... |
|
![]() |
![]() |
![]() |
#17 |
Senior Member
Iscritto dal: Oct 2002
Città: Roma
Messaggi: 1502
|
Qualcuno è riuscito a capire cosa fa il compilatore se si dichiara un campo array di lunghezza non specificata in una struttura ? Per le variabili il compilatore (mingw) dà errore, ma nelle struct lo accetta; ma forse non appartiene neppure a nessuno standard...
__________________
Sun Certified Java Programmer EUCIP Core Level Certified European Certification of Informatics Professionals |
![]() |
![]() |
![]() |
#18 |
Senior Member
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9569
|
secondo me va a scrivere in una zona casuale dello spazio di memoria del programma. questa è una mia ipotesi ma sicuramente avrò detto una cacchiata...
![]() |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 03:26.