Sì, la durata di una variabile locale rientra nell'ambito ( {
, }
) in cui è stata creata.
Le variabili locali hanno una memorizzazione automatica o locale. Automatici perché vengono automaticamente distrutti una volta terminato l'ambito entro il quale sono stati creati.
Tuttavia, quello che hai qui è una stringa letterale, che viene allocata in una memoria di sola lettura definita dall'implementazione. I valori letterali stringa sono diversi dalle variabili locali e rimangono attivi per tutta la durata del programma. Hanno durata statica [Rif 1] .
Una parola di cautela!
Tuttavia, si noti che qualsiasi tentativo di modificare il contenuto di una stringa letterale è un comportamento non definito (UB). Ai programmi utente non è consentito modificare il contenuto di una stringa letterale.
Pertanto, è sempre consigliabile utilizzare un const
while che dichiara una stringa letterale.
const char*p = "string";
invece di,
char*p = "string";
Infatti, in C ++ è deprecato dichiarare una stringa letterale senza il const
pensiero non in C. Tuttavia, dichiarare una stringa letterale con a const
ti dà il vantaggio che i compilatori di solito ti darebbero un avviso nel caso in cui tenti di modificare la stringa letterale in secondo caso.
Programma di esempio :
#include<string.h>
int main()
{
char *str1 = "string Literal";
const char *str2 = "string Literal";
char source[]="Sample string";
strcpy(str1,source);
strcpy(str2,source);
return 0;
}
Produzione:
cc1: gli avvisi vengono trattati come errori
prog.c: Nella funzione 'main':
prog.c: 9: errore: il passaggio dell'argomento 1 di 'strcpy' elimina i qualificatori dal tipo di destinazione del puntatore
Si noti che il compilatore avverte per il secondo caso, ma non per il primo.
Per rispondere alla domanda posta da un paio di utenti qui:
Qual è il problema con i letterali integrali?
In altre parole, il seguente codice è valido?
int *foo()
{
return &(2);
}
La risposta è no, questo codice non è valido. È mal formato e darà un errore del compilatore.
Qualcosa di simile a:
prog.c:3: error: lvalue required as unary ‘&’ operand
I letterali stringa sono valori l, cioè: Puoi prendere l'indirizzo di una stringa letterale, ma non puoi cambiarne il contenuto.
Tuttavia, qualsiasi altro letterali ( int
, float
, char
, etc.) sono R-valori (standard C usa il termine valore di un'espressione per questi) e indirizzo non può essere presa affatto.
[Rif 1] C99 standard 6.4.5 / 5 "String Literals - Semantics":
Nella fase di traduzione 7, un byte o un codice di valore zero viene aggiunto a ciascuna sequenza di caratteri multibyte risultante da una stringa letterale o letterale. La sequenza di caratteri multibyte viene quindi utilizzata per inizializzare un array di durata e lunghezza della memorizzazione statica appena sufficienti a contenere la sequenza . Per le stringhe di caratteri letterali, gli elementi dell'array hanno il tipo char e vengono inizializzati con i singoli byte della sequenza di caratteri multibyte; per i valori letterali di stringa ampia, gli elementi dell'array hanno il tipo wchar_t e vengono inizializzati con la sequenza di caratteri larghi ...
Non è specificato se questi array siano distinti a condizione che i loro elementi abbiano i valori appropriati. Se il programma tenta di modificare un tale array, il comportamento è indefinito .
int rc
. La sua vita finisce a ciascuno deireturn
-s. I puntatori che stai restituendo sono a stringhe letterali. I valori letterali stringa hanno una durata di archiviazione statica: la loro durata è almeno pari a quella del programma.