| 
 | |||||||
| 
 | 
|  | 
|  | 
|  | Strumenti | 
|  01-01-2005, 17:11 | #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 | 
|   |   | 
|  01-01-2005, 18:13 | #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...   | 
|   |   | 
|  01-01-2005, 21:09 | #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);
} | 
|   |   | 
|  02-01-2005, 23:42 | #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 | 
|   |   | 
|  03-01-2005, 08:53 | #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... | 
|   |   | 
|  03-01-2005, 11:23 | #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 | 
|   |   | 
|  03-01-2005, 12:32 | #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... | 
|   |   | 
|  03-01-2005, 12:53 | #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 | |
|   |   | 
|  03-01-2005, 12:58 | #9 | |
| Senior Member Iscritto dal: Sep 2002 Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello 
					Messaggi: 9571
				 | Quote: 
 | |
|   |   | 
|  03-01-2005, 13:01 | #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 | 
|   |   | 
|  03-01-2005, 13:07 | #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 | |
|   |   | 
|  03-01-2005, 13:11 | #12 | ||
| Senior Member Iscritto dal: Sep 2002 Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello 
					Messaggi: 9571
				 | Quote: 
  ragazzi comunque ho una domanda a cui non è ancora stata data una risposta: Quote: 
 | ||
|   |   | 
|  03-01-2005, 13:25 | #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 | |
|   |   | 
|  03-01-2005, 13:31 | #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 | |
|   |   | 
|  03-01-2005, 13:32 | #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. | |
|   |   | 
|  03-01-2005, 16:47 | #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... | |
|   |   | 
|  04-01-2005, 12:51 | #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 | 
|   |   | 
|  04-01-2005, 12:58 | #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: 10:38.









 
		 
		 
		 
		









 
  
 



 
                        
                        










