ho questo frammento di codice C:Quale di queste opzioni è una buona pratica per assegnare un valore stringa a una variabile in C?
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct Date {
int date;
char* month;
int year;
} Date_t;
typedef Date_t* pDate_t;
void assignMonth(pDate_t birth)
{
//1)
birth->month = "Nov";
//2)
//birth->month = malloc(sizeof(char) * 4);
//birth->month = strcpy(birth->month, "Nov");
}
int main()
{
Date_t birth;
birth.date = 13;
assignMonth(&birth);
birth.year = 1969;
printf("%d %s %d\n",birth.date, birth.month, birth.year);
return 0;
}
Nella funzione assignMonth
ho due possibilità per l'assegnazione mese. Entrambi mi danno lo stesso risultato nell'output, quindi qual è la differenza tra loro? Penso che la seconda variante sia quella giusta, sbaglio? Se sì, perché? Se no, perché?
Grazie in anticipo per qualsiasi aiuto.
P.S. Sono interessato a ciò che sta accadendo in memoria in entrambi i casi.
Per (1), "Nov" resterebbe nell'ambito?Avrei pensato che sarebbe stato aperto a essere sovrascritto da un altro metodo (sebbene questo esempio abbia solo questo metodo) poiché la funzione va fuori dal campo di applicazione (e quindi qualsiasi memoria che sta usando potrebbe essere riutilizzata). O perché questa è una stringa statica, va bene? Oppure questo compilatore dipende e diversi compilatori farebbero cose diverse? Ho sempre pensato che qualsiasi variabile o costante di qualsiasi tipo (int, pointer, char, qualunque cosa) in un metodo sarà nullo una volta che una funzione verrà chiusa, a meno che non sia stata dichiarata come 'statica'? –
I valori letterali stringa non escono mai dall'ambito perché non sono memorizzati nello stack (durata archiviazione automatica). È prescritto dallo standard C che i letterali stringa abbiano una durata di memorizzazione statica, il che significa che sono essenzialmente la stessa di una costante globale 'char' array, o una costante' char' array dichiarata con 'static' all'interno di una funzione. Ciò che è definito dal compilatore è se due letterali stringa identici si riferiscono alla * stessa * stringa globale, cioè non è garantito che '" Nov "' in 'foo()' e '" Nov "' in 'bar()' lo stesso indirizzo. –
Quale standard C richiede l'archiviazione statica su stringhe letterali? C89? –