tengo este fragmento de código C:¿Cuál de estas opciones es una buena práctica para asignar un valor de cadena a una variable en 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;
}
En la función assignMonth
Tengo dos posibilidades para la asignación de mes. Ambos me dan el mismo resultado en la salida, entonces, ¿cuál es la diferencia entre ellos? Creo que la segunda variante es la buena, ¿me equivoco? ¿Si es así por qué? Si no, ¿por qué?
Gracias de antemano por cualquier ayuda.
P.S. Me interesa lo que está sucediendo en la memoria en ambos casos.
Para (1), ¿estaría "Nov" dentro del alcance?Hubiera pensado que esto podría ser sobreescrito por otro método (aunque este ejemplo solo tiene este método) ya que la función queda fuera del alcance (y, por lo tanto, cualquier memoria que esté utilizando podría reutilizarse). O porque esta es una cadena estática, ¿está bien? ¿O es este compilador dependiente, y diferentes compiladores harían cosas diferentes? Siempre he supuesto que cualquier variable o constante de cualquier tipo (int, puntero, char, lo que sea) en un método será nula una vez que una función finalice, a menos que haya sido declarada como "estática". –
Los literales de cadena nunca salen del alcance porque no se almacenan en la pila (duración de almacenamiento automático). El estándar C exige que los literales de cadena tengan una duración de almacenamiento estática, lo que significa que son esencialmente lo mismo que una matriz 'char' constante global, o una matriz' char' constante declarada con 'static' dentro de una función. Lo que está definido por el compilador es si dos literales de cadena idénticos se refieren a la cadena * same * global, es decir, no se garantiza que '" Nov "' en 'foo()' y '" Nov "' en 'bar()' la misma dirección –
¿Qué estándar de C ordena el almacenamiento estático en literales de cadena? C89? –