2011-10-18 12 views
6

Estoy tratando de malloc y liberar una pequeña matriz/tabla de cadenas de una sola letra. Sé que esto se puede hacer en una matriz, pero quiero intentar hacer esto con un malloc y libre.¿Cómo malloc char ** tabla?

tengo unas pocas cosas en este momento:

char **letters = (char**) malloc(5 * sizeof(char*)); 
int i =0; 
for(i=0; i < NUMLETTERS ; ++i) 
{ 
    letters[i] = (char*) malloc(2*sizeof(char)); //2 is for the letter and null terminator 
} 

letters[0] = "a"; 
letters[1] = "b"; 
letters[2] = "c"; 
letters[3] = "d"; 
letters[4] = "e"; 

//Do stuff here 

int i =0; 
for(i=0; i < 5; ++i) 
{ 
    free(letters[i]); 
} 


free(letters); 

El código anterior compila bien y mi código en el medio también funciona y funciona muy bien, pero en tiempo de ejecución se pone un error durante las partes libres. Además, después de usar valgrind..it dice que el gratis (letras [i]); no es válido.

¿Algún ayuda?

Respuesta

5

El problema es aquí:

letters[0] = "a"; 
letters[1] = "b"; 
letters[2] = "c"; 
letters[3] = "d"; 
letters[4] = "e"; 

Está sobrescribiendo cada uno de sus punteros malloc'ed con literales de cadena. Luego los liberas en el ciclo final. Como está liberando efectivamente los literales de cadena, falla.

Hay dos maneras de resolver este:

1: No es necesario la asignación interna si sólo están asignando los literales de cadena a ellos. Así que deshazte de ambos bucles.

2: strcpy cada uno de los literales de cadena en su lugar.

+0

Ah! Debería hacer algo como: strcpy (letras [0], "a"); ¿Derecha? – Flipper

+0

Correcto, eso funcionará. – Mysticial

3

Está asignando correctamente la memoria para cada cadena en la matriz, pero entonces no está utilizando esa memoria. En su lugar, está alterando los punteros char* en cada uno de los cinco elementos de la matriz para apuntar a los literales de cadena "a", "b", "c", etc.

Ha perdido las referencias a la memoria original que asignado, y en su lugar está tratando de liberar memoria que no le pertenece.

En lugar de asignar los punteros de cadena como esta:

letters[0] = "a"; 

usted debe estar copiando la cadena en la memoria que ha asignado, así:

strncpy(letters[0], "a", 2); 
+0

el argumento de tamaño debe ser 2 para incluir el '\ 0'. Aquí hay un fragmento de prueba para probar mi punto: 'int main (int argc, char ** argv) { char * str1 =" a "; char str2 [2]; str2 [1] = 0xFF; strncpy (str2, str1, 1); printf ("str2 [0] =% x, str2 [1] =% x \ n", str2 [0] y 0xFF, str2 [1] y 0xFF); } ' –

+0

Solucionado ahora, gracias. –