Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Lenovo ThinkPad X1 2-in-1 G10 Aura Edition: il convertibile di classe
Lenovo ThinkPad X1 2-in-1 G10 Aura Edition: il convertibile di classe
La flessibilità di configurazione è il punto di forza di questo 2-in-1, che ripropone in un form factor alternativo tutta la tipica qualità dei prodotti Lenovo della famiglia ThinkPad. Qualità costruttiva ai vertici, ottima dotazione hardware ma costo che si presenta molto elevato.
Intervista a Stop Killing Games: distruggere videogiochi è come bruciare la musica di Mozart
Intervista a Stop Killing Games: distruggere videogiochi è come bruciare la musica di Mozart
Mentre Ubisoft vorrebbe chiedere agli utenti, all'occorrenza, di distruggere perfino le copie fisiche dei propri giochi, il movimento Stop Killing Games si sta battendo per preservare quella che l'Unione Europea ha già riconosciuto come una forma d'arte. Abbiamo avuto modo di parlare con Daniel Ondruska, portavoce dell'Iniziativa Europa volta a preservare la conservazione dei videogiochi
Samsung Galaxy S25 Edge: il top di gamma ultrasottile e leggerissimo. La recensione
Samsung Galaxy S25 Edge: il top di gamma ultrasottile e leggerissimo. La recensione
Abbiamo provato il nuovo Galaxy S25 Edge, uno smartphone unico per il suo spessore di soli 5,8 mm e un peso super piuma. Parliamo di un device che ha pro e contro, ma sicuramente si differenzia dalla massa per la sua portabilità, ma non senza qualche compromesso. Ecco la nostra prova completa.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 01-01-2005, 16:11   #1
Passy
Senior Member
 
L'Avatar di Passy
 
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);

}
Grazie per l'aiuto

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
Passy è offline   Rispondi citando il messaggio o parte di esso
Old 01-01-2005, 17:13   #2
VegetaSSJ5
Senior Member
 
L'Avatar di VegetaSSJ5
 
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...
VegetaSSJ5 è offline   Rispondi citando il messaggio o parte di esso
Old 01-01-2005, 20:09   #3
VegetaSSJ5
Senior Member
 
L'Avatar di VegetaSSJ5
 
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);

}
VegetaSSJ5 è offline   Rispondi citando il messaggio o parte di esso
Old 02-01-2005, 22:42   #4
Passy
Senior Member
 
L'Avatar di Passy
 
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;
pippo1 prende l'indirizzo di pippo e può essere utilizzato... (almeno spero)
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
Passy è offline   Rispondi citando il messaggio o parte di esso
Old 03-01-2005, 07:53   #5
cionci
Senior Member
 
L'Avatar di cionci
 
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...
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 03-01-2005, 10:23   #6
Passy
Senior Member
 
L'Avatar di Passy
 
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);
e non quando faccio:

Codice:
	char* str1;
	char str[]="prova";
	
	str1 = str; 
	
	printf("%s \n", str1);
e l'output è sempre lo stesso

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
Passy è offline   Rispondi citando il messaggio o parte di esso
Old 03-01-2005, 11:32   #7
cionci
Senior Member
 
L'Avatar di cionci
 
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...
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 03-01-2005, 11:53   #8
anx721
Senior Member
 
L'Avatar di anx721
 
Iscritto dal: Oct 2002
Città: Roma
Messaggi: 1502
Quote:
Originariamente inviato da cionci
Le stringhe non si dichiarano in quel modo ma così:

char pippo[]= "pippo";

perche non si puo diacharare una stringa cosi:

char* pippo= "pippo";


?
__________________
Sun Certified Java Programmer
EUCIP Core Level Certified

European Certification of Informatics Professionals
anx721 è offline   Rispondi citando il messaggio o parte di esso
Old 03-01-2005, 11:58   #9
VegetaSSJ5
Senior Member
 
L'Avatar di VegetaSSJ5
 
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9569
Quote:
Originariamente inviato da cionci
pippo1 = pippo;

E' un assegnamento sbagliato...

Un assegnamento valido è:

pippo1 = &pippo;
scusa cionci ma pippo è stato dichiarato com un array, quindi in mmoria la variabil pippo conterrà un indirizzo. prchè quindi è sbagliato far qusto pippo1= pippo;?
VegetaSSJ5 è offline   Rispondi citando il messaggio o parte di esso
Old 03-01-2005, 12:01   #10
Passy
Senior Member
 
L'Avatar di Passy
 
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;
Grazie
__________________
<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
Passy è offline   Rispondi citando il messaggio o parte di esso
Old 03-01-2005, 12:07   #11
anx721
Senior Member
 
L'Avatar di anx721
 
Iscritto dal: Oct 2002
Città: Roma
Messaggi: 1502
Quote:
Originariamente inviato da VegetaSSJ5
scusa cionci ma pippo è stato dichiarato com un array, quindi in mmoria la variabil pippo conterrà un indirizzo. prchè quindi è sbagliato far qusto pippo1= pippo;?
perche l'array è un puntatore a char, mentre pippo1 è stato dichairato come un puntatore a puntatore a char, quindi &pippo puo essere assegnato a pippo1, ma non pippo che e solo un puntatore e non un puntatore a puntatore
__________________
Sun Certified Java Programmer
EUCIP Core Level Certified

European Certification of Informatics Professionals
anx721 è offline   Rispondi citando il messaggio o parte di esso
Old 03-01-2005, 12:11   #12
VegetaSSJ5
Senior Member
 
L'Avatar di VegetaSSJ5
 
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9569
Quote:
Originariamente inviato da anx721
perche l'array è un puntatore a char, mentre pippo1 è stato dichairato come un puntatore a puntatore a char, quindi &pippo puo essere assegnato a pippo1, ma non pippo che e solo un puntatore e non un puntatore a puntatore
ops! che sbadato non ci avevo fatto caso! ro convinto che pippo1 fosse stato dichiarato com puntator a char! pardon! ragazzi comunque ho una domanda a cui non è ancora stata data una risposta:
Quote:
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)??
VegetaSSJ5 è offline   Rispondi citando il messaggio o parte di esso
Old 03-01-2005, 12:25   #13
anx721
Senior Member
 
L'Avatar di anx721
 
Iscritto dal: Oct 2002
Città: Roma
Messaggi: 1502
Quote:
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)??[
Non so quale sia le''effetto di dichiarare un array senza specificarne la dimensione, che è cosa diversa dal passare un array come parametro formale nella definizione di una funzione. Se dichiari un array senza specificarne il numero di elementi, probabilmente il compilatore assume che si tratti d un array di una sola posizione o di zero..non lo so, di certo un array è uno spazio di memori aallocato staticamente, quindi non bisogna allocare la sua memoria con malloc, difatti l'indirizzo a cui punta un array è immodificabile e il compilatore non compilerebbe neppure
__________________
Sun Certified Java Programmer
EUCIP Core Level Certified

European Certification of Informatics Professionals
anx721 è offline   Rispondi citando il messaggio o parte di esso
Old 03-01-2005, 12:31   #14
anx721
Senior Member
 
L'Avatar di anx721
 
Iscritto dal: Oct 2002
Città: Roma
Messaggi: 1502
Quote:
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;
La differenza sta nel fato che la prima struttura dichiara il campo array come un array di dimensione non specificata (e non so cosa questo comporti) di puntatori a char; una volta creata la struttura bisogna allocare memoria per ciasuno delgli elementi puntati dall'array; la seconda dichiarazione definisce array come un array di zero elementi di puntatori a char...mentre la terza definisce array come un puntatore a puntatore a char: una volta istanziata la struttura bisogna far puntare array a un altra variabile char** o bisogna istanziare esplicitamente la memroia con malloc per creare l'array dinamicamente, e poi utulizzare sempre la malloc per allocare memria per ogni elemento dell'array.
__________________
Sun Certified Java Programmer
EUCIP Core Level Certified

European Certification of Informatics Professionals
anx721 è offline   Rispondi citando il messaggio o parte di esso
Old 03-01-2005, 12:32   #15
VegetaSSJ5
Senior Member
 
L'Avatar di VegetaSSJ5
 
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9569
Quote:
Originariamente inviato da anx721
Non so quale sia le''effetto di dichiarare un array senza specificarne la dimensione, che è cosa diversa dal passare un array come parametro formale nella definizione di una funzione. Se dichiari un array senza specificarne il numero di elementi, probabilmente il compilatore assume che si tratti d un array di una sola posizione o di zero..non lo so, di certo un array è uno spazio di memori aallocato staticamente, quindi non bisogna allocare la sua memoria con malloc, difatti l'indirizzo a cui punta un array è immodificabile e il compilatore non compilerebbe neppure
e infatti se viene fatta la malloc su un array il compilator non compila. cmq guarda la struttura stru: essa al suo interno contine questa dichiarazion:

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.
VegetaSSJ5 è offline   Rispondi citando il messaggio o parte di esso
Old 03-01-2005, 15:47   #16
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Quote:
Originariamente inviato da anx721
perche non si puo diacharare una stringa cosi:

char* pippo= "pippo";


?
Si può fare anche così, ma è più sicuro fare la dichiarazione e l'inizializzazione come ho fatto io...almeno io ho sempre preferito usare questo metodo...

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...
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 04-01-2005, 11:51   #17
anx721
Senior Member
 
L'Avatar di anx721
 
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
anx721 è offline   Rispondi citando il messaggio o parte di esso
Old 04-01-2005, 11:58   #18
VegetaSSJ5
Senior Member
 
L'Avatar di VegetaSSJ5
 
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...
VegetaSSJ5 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Lenovo ThinkPad X1 2-in-1 G10 Aura Edition: il convertibile di classe Lenovo ThinkPad X1 2-in-1 G10 Aura Edition: il c...
Intervista a Stop Killing Games: distruggere videogiochi è come bruciare la musica di Mozart Intervista a Stop Killing Games: distruggere vid...
Samsung Galaxy S25 Edge: il top di gamma ultrasottile e leggerissimo. La recensione Samsung Galaxy S25 Edge: il top di gamma ultraso...
HP Elitebook Ultra G1i 14 è il notebook compatto, potente e robusto HP Elitebook Ultra G1i 14 è il notebook c...
Microsoft Surface Pro 12 è il 2 in 1 più compatto e silenzioso Microsoft Surface Pro 12 è il 2 in 1 pi&u...
La Cina ha sviluppato una macchina in gr...
Lanciati cinque nuovi satelliti cinesi G...
Meta avrebbe scaricato illegalmente migl...
QNAP annuncia la funzionalità di ...
Fino a 96 core per chip: la nuova CPU se...
Robot che crescono mangiando i loro simi...
Star Wars Outlaws 2 cancellato: per Ubis...
F1 senza freni: il film supera i 500 mil...
Una supersportiva elettrica da 429 CV a ...
Denodo DeepQuery: ricerche complesse in ...
Pluribus è la nuova ambiziosa ser...
IA come persone: avranno una personalit&...
Scoppia la bufera NSFW: la mano di Colle...
Philips porta OneBlade su Fortnite: arri...
Il consumo dei data center AI esplode: r...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 03:26.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v