Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1

    C Segmentation fault, scanf stringa su membro lista

    Premetto che L è un puntatore che punta all'elemento di una lista. Il membro della lista "str" è un puntatore a char. Quello che voglio fare è digitare da terminale una stringa ed assegnarla al membro str dell'elemento puntato da L.
    Evidentemente ho commesso qualche errore poichè il seguente codice mi da un segmentation fault. Mi chiedo cosa ho sbagliato... Sto prendendo in input una stringa ed il suo indirizzo in memoria lo salvo dentro al puntatore L->str.
    Ci vuole il vostro intervento!!

    codice:
    printf("Immettere membro \"str\": ");
    	
    	scanf("%s", L->str);

  2. #2
    per maggiore chiarezza ecco un esempio che per me è contradditorio ma per voi sicuramente saprete darli una spiegazione

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    typedef struct Elem {
    	long		 val;
    	char*		 str;
    	struct Elem *next;
    } Elem, *List;
    
    
    
    int main(void) {
    	List L = malloc( sizeof(Elem));
    	
    	//cosi funziona
    	char* a;
    	scanf("%s", a);
    	printf("%s\n",a );
    	
    	//cosi non funziona :-(
    	scanf("%s", L->str);
    	printf("%s\n", L->str );
    }
    out da terminale:
    3@tre ~
    $ ./b.exe
    ciao
    ciao
    hotel
    Segmentation fault (core dumped)
    ps: il primo ciao lo ho scritto io cosi come il primo hotel

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    prova
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    typedef struct _elem {
    	long		 val;
    	char	 str[100];
    	struct  _elem *next;
    } Elem, *List;
    
    
    
    int main(void) {
    	Elem * L = (Elem *) malloc( sizeof(Elem));
    
    	memset(L->str, 0x00, 100);
    	//cosi non funziona :-(
    	scanf("%s", L->str);
    	printf("%s\n", L->str );
    }
    ps è la terza discussione che apri sulla stessa cosa, magari rivedi la teoria dei puntatori, che forse non l'hai capita bene

    il codice che ti ho messo adesso funziona
    RTFM Read That F*** Manual!!!

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    I puntatori da soli non ti servono a nulla ... è come avere l'indirizzo di una casa ma non avere la casa!

    Devi *allocare* lo spazio che dovrai utilizzare ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Grazie ragazzi, in effetti non stavo considerando piu il fatto che devo allocare. Comunque sto facendo in un altro modo.
    L'obiettivo è creare una lista di elementi che hanno ognuno un membro che è una stringa allocata dinamicamente e DEVE essere cosi perche essendo un esercizio d'esame non posso cambiarlo.

    Ora vi chiedo se è corretto questo procedimento da ripetere n volte dove n è il numero degli elementi della lista.

    codice:
    	printf("Immettere membro \"str\": ");
    	char s[100];											//array di supporto
    	scanf("%s", s);
    	char** stringhe = NULL;									//array di puntatori a stringa
    	int n = 0;
    	stringhe = realloc(stringhe, sizeof(char*)*(n+1));		//alloco di un posto l'array di punt
    	stringhe[n] = malloc( sizeof(char)*(strlen(s)) );		//alloco la stringa dinamica della lunghezza che mi serve per memorizzare quello che ho preso in input
    	strcpy(stringhe[n], s);									//copio l'input nella stringa allocata in precedenza
    	L->str = malloc(sizeof(char*));							//alloco L->str di quanto serve per contenere un puntatore a stringa
    	L->str = stringhe[n];									//faccio puntare L->str alla stringa dinamica
    	n++;													//preparo n alla prossima iterazione
    Se mi dite che questo procedimento è giusto allora l'errore sta nel come concateno la lista...
    Aspetto voi! e come al solito vi ringrazio!!
    Ps: Ho provato con dei printf sul codice che vi ho scritto sopra e mi sembra tutto apposto, ma una vostra occhiata e conferma non guasta!

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    questa istruzione
    codice:
    L->str = malloc(sizeof(char*));
    richiede un'area di memoria della dimensione che tu hai specificato.
    La signature di questa funzione è questa

    codice:
    void *malloc(size_t size);
    sizeof(char*) ritorna la dimensione di un puntatore, tu chiedi spazio per allocare il puntatore, devi chiedere spazio per allocare la stringa!!!

    Infine, il valore di ritorno è un void * che è opportuno tu casti al tuo tipo, onde evitare guai dopo.

    Ritorno a consigliarti una revisione sull'argomento "puntatori"
    RTFM Read That F*** Manual!!!

  7. #7
    Ti ringrazio per la pazienza, ani ringrazio tutti voi
    Allora, ovviamente seguirò il tuo consiglio di rivedermi i puntatori ma prima vorrei chiudere questo topic arrivando ad un risultato.

    Tornando a noi.
    Originariamente inviato da valia
    questa istruzione
    codice:
    L->str = malloc(sizeof(char*));
    ...
    sizeof(char*) ritorna la dimensione di un puntatore, tu chiedi spazio per allocare il puntatore, devi chiedere spazio per allocare la stringa!!!
    Ho corretto il programma, ora riesco a creare correttamente la lista con tutti gli elementi che inserisco da terminale.
    Mi stranisce una cosa, quella riga che ti ho citato che tu mi hai corretto, l'ho proprio LEVATA, e aggiungo, sia che ce la metto che non ce la metto, non cambia nulla... Come mai??

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    dovrei vedere un po' tutto il codice, non solo quella sotto parte.
    Quello è cmq un errore che ripeti in più punti, attento alle istruzioni di malloc
    RTFM Read That F*** Manual!!!

  9. #9
    Originariamente inviato da valia
    dovrei vedere un po' tutto il codice, non solo quella sotto parte.
    Quello è cmq un errore che ripeti in più punti, attento alle istruzioni di malloc
    Nel senso che hai notato che faccio spesso, o che il fatto che il programma funziona è necessario ce quell errore lo faccia sempre affinchè si compensi e faccia funnzionare il tutto?

    Il codice completo è questo della funzione:
    ps: devo ancora mettergli i cast (anche se non capisco per il proff non ce li ha spiegati)
    codice:
    List crea_lista(void) {
    	List L = malloc(sizeof(Elem));
    	int ctrl;
    	printf("1 - Inserire primo elemento\n0 - Laciare lista vuota\n? ");
    	scanf("%d", &ctrl);
    	if(ctrl == 0) {
    		L = NULL;
    		return L;
    	}
    
    	List Lcpy = L;
    	
    	printf("Immettere membro \"str\": ");
    	char s[100];											//array di supporto
    	scanf("%s", s);
    	char** stringhe = NULL;									//array di puntatori a stringa
    	int n = 0;
    	stringhe = realloc(stringhe, sizeof(char*)*(n+1));		//alloco di un posto l'array di punt
    	stringhe[n] = malloc( sizeof(char)*(strlen(s)) );		//alloco la stringa dinamica della lunghezza che mi serve per memorizzare quello che ho preso in input
    	strcpy(stringhe[n], s);									//copio l'input nella stringa allocata in precedenza
    	L->str = stringhe[n];									//faccio puntare L->str alla stringa dinamica
    	n++;													//preparo n alla prossima iterazione
    	
    	printf("Immettere membro \"val\": ");
    	scanf("%ld", &L->val);
    	printf("\n1 - Inserire altro elemento\n0 - Interrompere inserimento\n? ");
    	scanf("%d", &ctrl);
    	if(ctrl) {
    		while(1) {
    			Lcpy->next = malloc(sizeof(Elem));
    			Lcpy = Lcpy->next;
    			
    			printf("Immettere membro \"str\": ");
    			scanf("%s", s);
    			stringhe = realloc(stringhe, sizeof(char*)*(n+1));
    			stringhe[n] = malloc( sizeof(char)*(strlen(s)) );
    			strcpy(stringhe[n], s);
    			Lcpy->str = stringhe[n];
    			n++;
    			
    			printf("Immettere membro \"val\": ");
    			scanf("%ld", &Lcpy->val);
    			printf("\n1 - Inserire altro elemento\n0 - Interrompere inserimento\n? ");
    			scanf("%d", &ctrl);
    			if(!ctrl) break;
    		}
    	}
    	Lcpy->next = NULL;
    	return L;
    }
    Sei gentilissimo ti ringrazio infinitamente

  10. #10
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    semmai gentilissima

    Il prof non può spiegarti anche le virgole, anche se mi fa strano non ti abbia accennato al fatto che bisogna fare un cast.
    Infine ti dico controlla le sizeof perché puoi pensare di allocare spazio per il contenuto e invece allochi spazio epr il contenitore (è diverso).

    Tu allochi lo spazio, poi fai dei passaggi, poi dici che

    L->str = stringhe[n];

    hai già allocato stringhe, assegni un puntatore ad un altro puntatore, corretto.

    Queste sono dettagli che derivano dai dubbi sui puntatori, quindi è un cane che si mangia la coda, il topic non lo puoi chiudere perché fondamentalmente dell'esercizio ci sono tante cose che non ti sono chiare per via delle lacune sulla teoria
    RTFM Read That F*** Manual!!!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.