2010-05-05 10 views
5

¿Es correcta la siguiente inicialización de matriz? Supongo que sí, pero no estoy seguro si puedo usar const char* o si es mejor usar std::string. Además de la primera pregunta, ¿apuntan los punteros a los segmentos de memoria del mismo tamaño?Struct Array Initialization and String Literals

struct qinfo 
{ 
    const char* name; 
    int nr; 
}; 
qinfo queues[] = { 
    {"QALARM", 1}, 
    {"QTESTLONGNAME", 2}, 
    {"QTEST2", 3}, 
    {"QIEC", 4} 
}; 
+1

Me quedaría en 'char const *'. Será mejor que no cambie a 'std :: string' para eso, a menos que desee sufrir el fiasco de orden de inicialización estática. –

Respuesta

2

Sí, se ve bien. Obviamente, no podrá modificar posteriormente ninguna de las cadenas de nombres (aunque puede cambiar los punteros para señalar diferentes cadenas si es necesario). El almacenamiento para cada una de las cadenas const será solo el necesario y típicamente será de solo lectura.

2

se ve bien, los tamaños de memoria para las cadenas serán diferentes como matrices de char * inicializan como que se asignarán diferentes tamaños. El compilador asignará espacios suficientes para contener los caracteres y luego un "\ 0" adicional para terminar la cadena.

+0

@ markh44 Punto razonable, editó la respuesta. – shuttle87

1

Está bien, ya que los literales de cadena tienen una duración de almacenamiento estático. No es necesario utilizar std::string en este caso porque implicará la asignación de memoria dinámica en tiempo de ejecución.

2

La inicialización es correcta pero el carácter * señalará fragmentos de memoria de diferentes tamaños, ya que necesitan contener cadenas de diferentes longitudes. Para su otra pregunta, si quiere asegurarse de que la cadena apuntada por el miembro de estructura permanece igual después de la inicialización, debe usar const std :: string (estoy ignorando los ataques de conversión aquí). Para hacer lo mismo que con un puntero char, que tendría que declarar como

const char* const 

es decir, tanto el puntero del valor y el valor señalaron son const.

0

Su código está bien, pero las cadenas estarán en diferentes cantidades de memoria, que pueden ser de solo lectura.

Para responder a la pregunta retórica, una pequeña modificación de la struct permitirá la modificación de las cuerdas y corregir el diseño de memoria (todavía específico de la plataforma, por supuesto) muy bien:

struct qinfo 
{ 
    char name[50]; // string lives inside the struct 
    int nr; 
}; 
qinfo queues[] = { 
    {"QALARM", 1}, // the literals are used to initialize the char array 
    {"QTESTLONGNAME", 2}, // they should not be otherwise 
    {"QTEST2", 3},  // compiled into the program 
    {"QIEC", 4} 
}; 
0

se ve bien para mí . No puedo ver nada mal.