Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Wind Tre 'accende' il 5G Standalone in Italia: si apre una nuova era basata sui servizi
Wind Tre 'accende' il 5G Standalone in Italia: si apre una nuova era basata sui servizi
Con la prima rete 5G Standalone attiva in Italia, WINDTRE compie un passo decisivo verso un modello di connettività intelligente che abilita scenari avanzati per imprese e pubbliche amministrazioni, trasformando la rete da infrastruttura a piattaforma per servizi a valore aggiunto
OPPO Find X9 Pro: il camera phone con teleobiettivo da 200MP e batteria da 7500 mAh
OPPO Find X9 Pro: il camera phone con teleobiettivo da 200MP e batteria da 7500 mAh
OPPO Find X9 Pro punta a diventare uno dei riferimenti assoluti nel segmento dei camera phone di fascia alta. Con un teleobiettivo Hasselblad da 200 MP, una batteria al silicio-carbonio da 7500 mAh e un display da 6,78 pollici con cornici ultra ridotte, il nuovo flagship non teme confronti con la concorrenza, e non solo nel comparto fotografico mobile. La dotazione tecnica include il processore MediaTek Dimensity 9500, certificazione IP69 e un sistema di ricarica rapida a 80W
DJI Romo, il robot aspirapolvere tutto trasparente
DJI Romo, il robot aspirapolvere tutto trasparente
Anche DJI entra nel panorama delle aziende che propongono una soluzione per la pulizia di casa, facendo leva sulla propria esperienza legata alla mappatura degli ambienti e all'evitamento di ostacoli maturata nel mondo dei droni. Romo è un robot preciso ed efficace, dal design decisamente originale e unico ma che richiede per questo un costo d'acquisto molto elevato
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 01-01-2005, 17: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, 18: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: 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...
VegetaSSJ5 è offline   Rispondi citando il messaggio o parte di esso
Old 01-01-2005, 21: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: 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);

}
VegetaSSJ5 è offline   Rispondi citando il messaggio o parte di esso
Old 02-01-2005, 23: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, 08: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, 11: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, 12: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, 12: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, 12: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: 9571
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, 13: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, 13: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, 13: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: 9571
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, 13: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, 13: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, 13: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: 9571
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, 16: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, 12: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, 12: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: 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...
VegetaSSJ5 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Wind Tre 'accende' il 5G Standalone in Italia: si apre una nuova era basata sui servizi Wind Tre 'accende' il 5G Standalone in Italia: s...
OPPO Find X9 Pro: il camera phone con teleobiettivo da 200MP e batteria da 7500 mAh OPPO Find X9 Pro: il camera phone con teleobiett...
DJI Romo, il robot aspirapolvere tutto trasparente DJI Romo, il robot aspirapolvere tutto trasparen...
DJI Osmo Nano: la piccola fotocamera alla prova sul campo DJI Osmo Nano: la piccola fotocamera alla prova ...
FUJIFILM X-T30 III, la nuova mirrorless compatta FUJIFILM X-T30 III, la nuova mirrorless compatta
4 Maxi TV in sconto su Amazon: fino a 75...
Da 579€ a 639€: 3 portatili imperdibili ...
Il nuovo Apple Watch SE 3 scende subito ...
Amazon ha cancellato il nuovo MMO de Il ...
Stranger Things 5: il trailer ufficiale ...
Apple chiude un anno fiscale da record. ...
Windows 11, gli aggiornamenti diventano ...
WhatsApp arriva su Apple Watch: tutte le...
Amazon inspiegabile: è attivo un ...
Così SK hynix vuole rivoluzionare...
Stop ai sussidi per le elettriche: la Ci...
Super offerte Google Pixel su Amazon: fi...
Amazon oltre le aspettative: i numeri re...
WhatsApp introduce le passkey per sempli...
L'offerta finisce alle 20 di oggi: Xiaom...
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: 10:38.


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