Assegnazione di stringhe al puntatore in C

2

La mia domanda riguarda i puntatori in C. Per quanto ho appreso e cercato, i puntatori possono solo memorizzare gli indirizzi di altre variabili, ma non possono memorizzare i valori attuali (come numeri interi o caratteri). Ma nel codice sottostante il puntatore char c in realtà sta memorizzando una stringa. Esegue senza errori e fornisce l'output come 'nome'.

#include <stdio.h>
main()
{
  char *c;
  c="name";
  puts(c);
}

Qualcuno può spiegare come un puntatore stia memorizzando una stringa senza memoria o se viene creata memoria dove viene creata e quante dimensioni può essere creata?

Ho provato ad usarlo con il puntatore del tipo intero

#include <stdio.h>
main()
{
  int *c;
  c=10;
  printf("%d",c);
}

ma ha dato un errore

cc     test.c   -o test
test.c: In function ‘main’:
test.c:5:3: warning: assignment makes pointer from integer without a cast   [enabled by default]
c=10;
^
test.c:6:2: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘int *’ [-Wformat=]
printf("%d",c);
^

I puntatori memorizzano l'indirizzo della variabile, quindi perché il puntatore intero è diverso dal puntatore del carattere?

C'è qualcosa che mi manca?

    
posta Sudheer 11.07.2014 - 06:58
fonte

2 risposte

10

Questo è il modo in cui le stringhe letterali funzionano in C. Le stringhe letterali come "name" sono matrici di caratteri, è equivalente all'array di cinque elementi {'n', 'a', 'm', 'e', 'char*'} . Per il codice

char *c;
c="name";

l'ambiente riserva la memoria per l'array sopra già in fase di inizializzazione, quando il programma viene caricato dal disco in memoria. In fase di esecuzione, l'indirizzo dell'inizio di tale array è assegnato a c.

Nota che il primo pezzo di codice del tuo non è equivalente al secondo, perché nel primo pezzo assegni un string letterale (e non un carattere come 'n') a un int variabile. Nel secondo, provi ad assegnare un int array (e non un int* ) a un %code% .

Ecco un tutorial su stringhe e puntatori in C con una spiegazione più dettagliata .

    
risposta data 11.07.2014 - 07:25
fonte
3

I valori letterali stringa come "name" vengono memorizzati come matrici di char ( const char in C ++) in modo tale che vengano allocate all'avvio e in attesa del programma fino al termine del programma.

Il tipo dell'espressione "name" è "array di 5 elementi di char " (quinto elemento per il terminatore 0). Tranne quando è l'operando degli operatori sizeof o unary * , o è un letterale stringa utilizzato per inizializzare un array in una dichiarazione, verrà convertita un'espressione di tipo "Array di elementi N di T " ("decay") a un'espressione di tipo "puntatore a T " e il valore dell'espressione sarà l'indirizzo del primo elemento dell'array.

Quindi, quando scrivi

c="name";

"name" non è l'operando degli operatori sizeof o unary * e non viene utilizzato per inizializzare un array in una dichiarazione, quindi l' indirizzo del primo elemento della stringa viene assegnato alla variabile puntatore c . In sostanza, quello che hai in memoria è qualcosa del tipo:

            +-----+
"name"[0] : | 'n' |  <-------+
            +-----+          |
"name"[1] : | 'a' |          |
            +-----+          |
"name"[2] : | 'm' |          |
            +-----+          |
"name"[3] : | 'e' |          |
            +-----+          |
"name"[4] : |  0  |          |
            +-----+          |
              ...            |
            +-----+          |
        c : |     | ---------+
            +-----+
    
risposta data 11.07.2014 - 17:27
fonte

Leggi altre domande sui tag