2009-07-11 12 views
8

Pensé que podría declarar una matriz, y luego iniciarla.C declarando una matriz de caracteres *

Al igual que

char* myArray[3]; 


//CODE INBETWEEN 

myArray[3] = { 

      "blah", 
      "blah", 
      "blah"}; 
+1

Usted está declarando una serie de punteros de caracteres. Cada puntero debería apuntar a un búfer dinámico o estático antes de poder usar strcpy() u otras operaciones de cadena para cambiar los contenidos. – stanigator

+0

Entonces, ¿debo iniciar y declarar al mismo tiempo?> –

Respuesta

18

No, sólo se puede inicializar una matriz primera vez que se declara. La razón es que las matrices no son valores l modificables.

En su caso:

char *array[] = {"blah", "blah", "blah"}; 

No es necesario especificar el tamaño, pero puede hacerlo si lo desea. Sin embargo, el tamaño no puede ser inferior a 3 en este caso. Además, las tres cadenas se escriben en la memoria de solo lectura, por lo que algo como array[1][2] = 'c' para cambiar el segundo "blah" a "blch" normalmente dará como resultado una segfault.

+2

Más precisamente, las matrices en la mayoría de los contextos evalúan valores r, no valores l, y no se permite la asignación a un valor r. – caf

+0

En realidad, su explicación es probablemente más correcta. Editado mi publicación. –

0

Usted pensó equivocado. La inicialización solo es posible en la declaración. Después de eso, solo puedes asignar valores individuales.

0

Es una expresión de inicialización. No puede haber ese código en medio, debe ser usado en la línea con la declaración.

2

Como han dicho otros, solo se pueden usar los inicializadores cuando se declara la variable. La manera más cercana de hacer lo que quiere es:

char *myArray[3]; 

/* CODE INBETWEEN */ 

{ 
    static const char *tmp[3] = { 
      "blah", 
      "blah", 
      "blah" }; 
    memcpy(myArray, tmp, sizeof myArray); 
} 
1

Sí, puede declarar una matriz y luego inicializarla.
Sin embargo, hay una excepción aquí.
Está declarando una matriz de puntero de carácter (que funcionó bien).
Y, entonces usted es creando cadenas constantes para asignarlas a la matriz.

Ahí es donde comienza el problema.
Las cadenas constantes son solo primitivas del compilador que no obtienen ninguna ubicación de memoria direccionable en la forma en que las ha utilizado. Se pueden asignar directamente en el momento de inicialización de la matriz (como se muestra en Mike); que le indicará al compilador que los asigne como constantes disponibles en el tiempo de ejecución y que permita una inicialización cuando se inicie el alcance de myArray.


Lo que han intentado habría funcionado bien con

int numberArray[3]; 
// code here 
numberArray[0] = 1; 
numberArray[1] = 2; 
numberArray[2] = 3; 

Ayuda a tener en cuenta que un puntero de carácter y una instancia de cadena son dos entidades diferentes; el primero puede apuntar al segundo.

+0

En su ejemplo, no está inicializando los valores. Usted simplemente está configurando el valor. Un optimizador puede convertir lo que escribió en la inicialización, pero no hay garantía. – Jared

+0

@Jared, tomaré su voto negativo y comento en el espíritu del significado exacto de 'inicialización'.Sin embargo, no creo que la pregunta haya significado la palabra en ese sentido. – nik

Cuestiones relacionadas