|
|||||||
|
|
|
![]() |
|
|
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: 9571
|
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: 9571
|
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 ( ) anche se non ho ancora provato a inserire molti record. Magari fra un pò mi accorco di un comportamente strano.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: 9571
|
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: 9571
|
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: 9571
|
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: 9571
|
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: 00:15.











) anche se non ho ancora provato a inserire molti record. Magari fra un pò mi accorco di un comportamente strano.








