2010-01-08 75 views
49

¿Cómo logro el equivalente dinámico de esta gama de inicialización estática:¿Cómo inicializar una matriz dinámica en C++?

char c[2] = {}; // Sets all members to '\0'; 

En otras palabras, crear una matriz dinámica con todos los valores inicializados al carácter de terminación:

char* c = new char[length]; // how do i amend this? 
+3

Wow .. esto resulta ser una gran pregunta. Mucha gente que no sabe de std :: fill_n parece. – Draemon

+0

Solo para que quede constancia, no estoy completamente al tanto de 'std :: fill_n', es solo que lo ignoro en su mayoría, y solo uso algoritmos n cuando es necesario. Es entonces cuando el tipo de iterador no admite 'operator +', y 'std :: advance' podría ser ineficiente. Ninguna de esas condiciones es verdadera de punteros. –

Respuesta

95
char* c = new char[length](); 
+0

Siempre me olvido de esto. No funciona para ningún otro valor, pero luego el interlocutor no pidió ningún otro valor ... –

+4

Guau, nunca había visto eso antes. –

+2

Es cierto ... ¡aprendes algo nuevo todos los días! – Rob

1

Sin medios internos, AFAIK. Use esto: memset (c, 0, length);

3

No puede hacerlo en una línea fácilmente. Que puede hacer:

char* c = new char[length]; 
memset(c, 0, length); 

O bien, puede sobrecargar el nuevo operador:

void *operator new(size_t size, bool nullify) 
{ 
    void *buf = malloc(size); 

    if (!buf) { 
      // Handle this 
    } 

    memset(buf, '\0', size); 

    return buf; 
} 

entonces usted será capaz de hacer:

char* c = new(true) char[length]; 

mientras

char* c = new char[length]; 

mantendrá el viejo comportamiento. (Tenga en cuenta que si quiere que todos los new s pongan a cero lo que crean, puede hacerlo utilizando el mismo anterior pero eliminando la parte bool nullify).

Tenga en cuenta que si elige la segunda ruta, debe sobrecargar el nuevo operador estándar (el que no tiene bool) y el operador de eliminación también. Esto es porque aquí está usando malloc(), y el estándar dice que las operaciones malloc() + delete no están definidas. Por lo tanto, debe sobrecargar delete para usar free() y la versión nueva normal para usar malloc().

Aunque en la práctica todas las implementaciones utilizan malloc()/free() internamente, por lo que incluso si usted no lo hace más probable es que no tenga algún problema (excepto los abogados de lengua gritando en usted)

+0

Pero ... Puedes ver std :: fill/std :: fill_n –

+0

Las gafas ... no hacen nada – Draemon

+0

@Draemon .. ¿eh, qué? –

5

C++ no tiene ninguna característica específica para hacer eso. Sin embargo, si usa std :: vector en lugar de una matriz (como probablemente debería hacer), puede especificar un valor para inicializar el vector.

std::vector <char> v(100, 42); 

crea un vector de tamaño 100 con todos los valores inicializados a 42.

28

dos maneras:

char *c = new char[length]; 
std::fill(c, c + length, INITIAL_VALUE); 
// just this once, since it's char, you could use memset 

O:

std::vector<char> c(length, INITIAL_VALUE); 

En mi segunda manera, el segundo parámetro por defecto es 0 ya, por lo que en su caso es innecesario:

std::vector<char> c(length); 

[Editar: ve a votar por la respuesta de Fred, char* c = new char[length]();]

1

y el comentario implícito de muchos carteles => No use matrices, use vectores. Todos los beneficios de las matrices sin ninguno de los inconvenientes. Además te dan un montón de otras cosas

Si usted no sabe STL, leer Josuttis La biblioteca de C++ y Meyers estándar STL efectiva

0

tiene que inicializar "a mano":

char* c = new char[length]; 
for(int i = 0;i<length;i++) 
    c[i]='\0'; 
+1

Puede hacer esto, pero no es necesario. Vea arriba sobre std :: fill() y std :: fill_n(). –

4

La forma de matriz de nueva expresión acepta solo una forma de inicializador: un () vacío. Esto, por cierto, tiene el mismo efecto que el {} vacío en su inicialización no dinámica.

Cuestiones relacionadas