Visualizzazione dei risultati da 1 a 9 su 9

Discussione: [C] array di puntatori

  1. #1

    [C] array di puntatori

    E' possibile in qualche modo salvare direttamente una stringa in un vettore puntato da un puntatore contenuto in un array di puntatori?
    Mi spiego meglio:
    int main()
    { ...

    char *arraydp[10]; //dichiaro un array di puntatori
    scanf("%s",arraydp[0]); //tento di memorizzare quanto letto da tastiera, nel vettore
    //puntato da arraydp[0]
    return 0;
    }

    risulta al mio compilatore un'operazione non valida; mi compila il programma ma al momento dell'esecuzione mi dà segmentation fault, perché?



    Ammissibile invece è l'operazione:

    ...
    char buff[10], *arraydp[10];
    scanf("%s",buff);
    arraydp[0]=buff;
    ...
    esiste un modo per evitare questo passaggio intermedio?

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    arraydp[0] è un semplice puntatore a carattere, ma né il compilatore (staticamente) né il sistema operativo (dinamicamente) hanno allocato spazio per la stringa... quel puntatore contiene un indirizzo casuale, non l'indirizzo di un'area di memoria opportunamente allocata. Quando vai a leggere la stringa da tastiera, stai quindi provando a scrivere in un'area di memoria arbitraria e questo ti causa il segmentation fault.

    Nel secondo esempio invece non hai problemi perché appunto hai allocato memoria staticamente per dieci caratteri (in realtà 9 più il terminatore) quindi la lettura va a buon fine, a meno che la stringa immessa non sia più lunga dello spazio allocato (in quel caso, incorri in problemi simili a quelli del caso precedente).
    every day above ground is a good one

  3. #3
    E come mai invece per le strutture viene allocata direttamente memoria?
    Coma mai cioè, un'operazione del genere è invece consentita?

    struct prova{
    char nome;};

    int main()
    {...

    struct prova arrayprove[10];
    scanf("%s",arrayprove[0].nome);
    }

    PS grazie per l'aiuto!

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    A dire il vero in quel caso dovresti addirittura avere problemi nella compilazione visto che nella scanf() specifichi %s come codice di formato (che è per i puntatori a carattere) e arrayprove[0].nome è un semplice carattere, non un puntatore.

    Se intendevi invece qualcosa come

    codice:
    struct prova {
            char *nome;
    }
    
    int main(void)
    {
            struct prova arrayprove[10];
            scanf("%s",arrayprove[0].nome);
    
            return 0;
    }
    allora hai esattamente lo stesso problema del primo esempio. Prova.
    every day above ground is a good one

  5. #5
    Sì scusami, la variabile denominata "nome" era di tipo vettore:

    #include<stdio.h>
    struct prova {
    char nome[10];
    };

    int main()
    {
    struct prova arrayprove[10];
    scanf("%s",arrayprove[0].nome);

    return 0;
    }


    e il tutto funziona normalmente; perché?
    PS sostituendo" char *nome " a "char nome[10] invece dà effettivamente segmentation fault

  6. #6
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Originariamente inviato da franzSPECIAL
    PS sostituendo" char *nome " a "char nome[10] invece dà effettivamente segmentation fault
    Perché usando char *nome non allochi la memoria necessaria (cosa che fai con char nome[10]). Se vuoi usare char *nome devi poi allocare la memoria usando malloc.
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  7. #7
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Originariamente inviato da YuYevon
    A dire il vero in quel caso dovresti addirittura avere problemi nella compilazione visto che nella scanf() specifichi %s come codice di formato (che è per i puntatori a carattere) e arrayprove[0].nome è un semplice carattere, non un puntatore.
    Il compilatore C non segnala questi problemi. Tu potresti indicare %d e salvare tutto in un array di char senza che il gcc si arrabbi... Ovviamente otterrai poi un errore a tempo di esecuzione.
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  8. #8
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Sì, più che "dovresti" infatti avrei dovuto scrivere "potresti" visto che dipende anche dalle opzioni di compilazione. Con gcc -Wall queste righe di codice:

    codice:
       char x;
       scanf("%s", x);
    mi danno

    codice:
    warning: format '%s' expects type 'char *', but argument 2 has type 'int'
    every day above ground is a good one

  9. #9
    Grazie a tutti!

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 © 2025 vBulletin Solutions, Inc. All rights reserved.