2010-11-24 9 views
10

Estoy tratando de hacer una matriz de tamaño variable en c.¿Por qué una matriz de longitud variable grande tiene un valor fijo -1 incluso si está asignada a C?

La matriz sigue volviendo a tener un valor de -1.

Lo que quiero hacer es hacer una matriz de tamaño size y luego añadirle valor incrementalmente. ¿Qué estoy haciendo mal?

int size = 4546548; 

UInt32 ar[size]; 
//soundStructArray[audioFile].audioData = (UInt32 *)malloc(sizeof(UInt32) * totalFramesInFile); 
//ar=(UInt32 *)malloc(sizeof(UInt32) * totalFramesInFile); 
for (int b = 0; b < size; b++) 
{ 
    UInt32 l = soundStructArray[audioFile].audioDataLeft[b]; 
    UInt32 r = soundStructArray[audioFile].audioDataRight[b]; 
    UInt32 t = l+r; 
    ar[b] = t; 
} 
+0

duplicado de http://stackoverflow.com/questions/448844/variable-sized-arrays-in-c – alvin

+0

El código se ve bien, pero el tamaño es grande. ¿Estás seguro de que tu programa tiene 18MB de stack para usar? –

+0

@Steve. Me estaba confundiendo la cantidad de elementos que quiero que contenga mi matriz y el tamaño real de la misma. – dubbeat

Respuesta

9

Lo que se necesita es una matriz dinámica. Uno que puede asignar un tamaño inicial, luego use realloc para aumentar el tamaño del mismo por algún factor cuando sea apropiado.

Es decir,

UInt32* ar = malloc(sizeof(*ar) * totalFramesInFile); 
/* Do your stuff here that uses it. Be sure to check if you have enough space 
    to add to ar and if not, call grow_ar_to() defined below. */ 

Utilice esta función para crecer:

UInt32* grow_ar_to(UInt32* ar, size_t new_bytes) 
{ 
    UInt32* tmp = realloc(ar, new_bytes); 
    if(tmp != NULL) 
    { 
     ar = tmp; 
     return ar; 
    } 
    else 
    { 
     /* Do something with the error. */ 
    } 
} 
+0

solo en una nota. Si totalframesinfile es 50 ¿significa eso que hay 50 espacios en la matriz y cada espacio es de tamaño UNint32? – dubbeat

+0

Eso es correcto. – jer

4

Probablemente debería asignar (y posteriormente libre) la matriz de forma dinámica, así:

int *ar = malloc(sizeof(int) * size); 
for (int b = 0; b < size; b++) 
{ 
    ... 
} 

// do something with ar 

free(ar); 
-1

C no permite una variable que se utiliza al definir un tamaño de la matriz, lo que se necesita hacer es utilizar malloc, esto debe darle una idea:

UInt32* ar; 
ar = (UInt32*) malloc(size * sizeof(UInt32)); 

no se olvide de liberarlo para arriba luego

+0

"C no permite que se use una variable al definir un tamaño de matriz" es lo que no sabía – dubbeat

+5

@dubbeat: C (la versión actual, C99) sí lo permite. C89 no. Los compiladores que no lo admitan deberían dar un mensaje de error en tiempo de compilación ("Espera expresión esperada", o similar), no compilar, pero darle un valor inesperado de -1. Qué compilador estas usando? –

+0

Ah, mi mal entonces. Es cierto, ya que no estaba obteniendo un error de compilación – Argote

1

si hace que el tamaño de un const int funcione. Además, si su matriz está dentro de una función y el tamaño es un argumento de dicha función, eso debería funcionar también.

Cuestiones relacionadas