Array de "X" strings en C

VipeR_CS

Holaquetal, os cuento. Estoy aprendiendo C y me dio por hacer un ejercicio que en principio me parecía asequible (vengo de vb.net y java) pero se está complicando la cosa xD. El caso es que necesito hacer un array de strings, pero hasta cierto punto no sé para cuántos, ni de qué longitud será cada uno de ellos.

Supongo que la solución será reservar la memoria con malloc, pero no hay cojones a que salga. Tengo esto:

char **palabras;
palabras = malloc (count * sizeof *palabras);

donde "count" es una variable que ya tiene su valor asignado y es el número de strings que voy a tener que almacenar. El caso es que no me deja hacer esa asignación, y no sé cómo hacerlo ;( Se agradece una ayudita. Gracias de antemano.

MTX_Anubis

char **palabras;
palabras = malloc (count * sizeof (char));

Hace años que no toco c vaya pero imagino que será así

Sirius_spa

es bidimensional, por lo tanto tienes que reservar memoria para las filas y las columnas:

char **palabras;
palabras = malloc (count * sizeof *palabras);

Es lo que has puesto tu, pero esto sólo reserva filas( en tu caso el numero de cadenas que quieres guardar),pero necesitas reservar las columnas(en numero de caracteres que quieras para las cadenas)

for (i = 0; i < count; i++){
palabras = malloc(n_letras_cadena * sizeof *matriz);
}

VipeR_CS

#2 No, el problema persiste con eso, además que creo que el concepto estaría mal. Estaría reservando en cada fila memoria para el tamaño de tantos char como filas quiero, pero es que en cada fila no hay un char, hay otro array de chars (un string vamos xD).

#3 Suponía que tendría que hacer eso, pero es que no puedo hacer lo segundo porque tampoco me deja hacer lo primero xD. Una imagen vale más que mil palabras:

Como veis no me deja hacer esa asignación, supongo que porque malloc devuelve un puntero y se lo estoy asignando a un puntero de punteros o yo que sé qué coño pasa aquí... xD. El error que sale arriba es el mismo que abajo.

#5 Sí, pero vamos que a una mala puedo ponerle un tamaño fijo a las filas, eso tampoco es lo principal. Lo principal es ponerle un número de filas dinámicamente.

MTX_Anubis

#3 pero cada string tiene un tamaño distinto. Creo qeu lo que quiere es primero crear el array y luego ir metiendole los strings. Vamos que quiere crear un array de punteros

#4 Si, si, me di cuenta después. La verdad es que después de java uno se olvida de todo esto xD

prueba poniendole (char*) antes del malloc.

Buffoncete

En realidad si lo quieres hacer respetando los standard es unidimensional con el siguiente formato.

palabra\0palabra\0palabra\0\0

así que reserver memoria sería (sizeof(palabra)+1)*count+1

VipeR_CS

#6 Un puntero de punteros no cumple el standard? Mira que me extraña xD. No sé, no lo veo claro de esa forma, para añadir elementos sería un jaleo y para recuperarlos otro tanto de lo mismo :\

#5 con (char*) no, pero puse (char**) por probar y sí que se quitó el error. Lo que no sé es si implosionará el pc luego al ejecutarlo pero el error se ha quitado xD Seguiremos informando :x Gracias.

maRc

#7, C++ no tiene conversión explícita de tipos, C sí. Estás utilizando un compilador de C++, así que te da ese error.

La función malloc devuelve un puntero a void (void *), por lo que debes convertirlo al tipo que corresponda. En la primera asignación, a puntero a puntero a char (char **) y en la segunda a puntero a char (char *).

No es lo mismo C que C++, aunque casi todo lo que puedes hacer en C lo puedes hacer en C++, pero son diferentes lenguajes.

PD: #6, explícate un poco más, ¿qué es eso de que no es estánda?

MTX_Anubis

a ver, yo pienso que deberías hacerlo así


palabras = (char**)malloc(coun*sizeof(*palabras));

for(blablabla)
palabras[i] = (char*)malloc((numero_de_letras+1)*sizeof(char)); <- aquí ya reservamos el sitio para cada char

Y sí, todos los Strings debería terminar en /0 por eso hay que dejar un hueco más :P

eidt: Vaya, lo que dijo marc xd

Buffoncete

char ** palabras;

palabras = (char *)malloc(count);

for(int i = 0; i < count; i++)
{
palabras[ i ] = (char *)malloc(TAMAÑODELAPALBRA);
}

VipeR_CS

#8 Lo tendré en cuenta para el futuro, si da error de conversión lo fuerzo y ala, que explote el pc si quiere.

#9 Así es como lo tenía ahora exactamente, sí:

char **palabras;
palabras = (char**)malloc (count * sizeof *palabras);

for (i = 0; i < count; i++)
	palabras[i] = (char*)malloc(21 * sizeof (char));

Aún no lo he probado, pero no me voy a complicar más la vida y voy a poner 21 caracteres a cada string, palabras de más de 20 letras no creo yo que sean muy comunes >.<

#10 la primera asignación tiene que ser con (char**). El resto es lo mismo pero sin el sizeof.

Usuarios habituales

  • VipeR_CS
  • Buffoncete
  • MTX_Anubis
  • maRc
  • Sirius_spa