es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Pasando una matriz de cadenas como argumento y modificándola dinámicamente dentro de la función en C.

Necesito poblar dinámicamente un arreglo de cadenas en C. Aquí está el ejemplo de mi código. Compila bien, pero hay fallas de segmentación. ¿Es posible lograr esta funcionalidad?

“`c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_FILE_NAME_LENGTH 255

void loadList(char* files, int *filesSize);

int main (int argc, char <em>argv[])
{
char</em> files;
int filesSize=-1;

loadList(&files, &filesSize);

for(int i=0;i< filesSize;i++) printf("%s\n", files[i]);

free(files);

return 0;
}

//////////////////////////////////////////////////////////////////////////////////

void loadList(char* files, int filesSize){
*filesSize=3;

char *values[] = {"100.dat", "150.dat", "200.dat"};

for(int i=0;i< <em>filesSize;i++){
files=(char</em>) realloc(files,(i+1) * sizeof(*files));
files[i]=malloc((MAX_FILE_NAME_LENGTH+1) * sizeof(char));
strcpy(files[i],values[i]);
printf("%s\n", files[i]);
}
}
“`</string.h></stdlib.h></stdio.h>

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Sí, es posible poblar dinámicamente una matriz de cadenas en C utilizando el código proporcionado. Sin embargo, los fallos de segmentación pueden ser causados por una asignación de memoria incorrecta y el acceso a memoria fuera de límites.

    En la función loadList, el parámetro files es un puntero a un puntero de char, y filesSize es un puntero a int. filesSize se establece en 3, lo que indica que la matriz tendrá 3 elementos.

    Se crea una matriz local values con 3 literales de cadena. Luego, un bucle for itera sobre los elementos de la matriz y cada elemento se agrega a la matriz files.

    Dentro del bucle, se utiliza realloc para redimensionar la matriz files y que contenga i+1 elementos. Luego, se utiliza malloc para asignar memoria para cada cadena y strcpy para copiar el literal de cadena de values a la memoria recién asignada.

    Sin embargo, al asignar la nueva memoria a *files[i], el operador de subíndice de la matriz tiene una precedencia mayor que el operador de desreferencia. Por lo tanto, debería ser (*files)[i] en lugar de *files[i].

    Además, la instrucción printf debería usar %s en lugar de %p para imprimir la cadena.

    El código corregido es:

    void loadList(char*** files, int* filesSize){
      *filesSize = 3;
      //some array for the example
      char* values[] = {"100.dat", "150.dat", "200.dat"};
      for(int i=0; i<*filesSize; i++){
        *files = (char**) realloc(*files, (i+1) * sizeof(**files));
        (*files)[i] = malloc((MAX_FILE_NAME_LENGTH+1) * sizeof(char));
        strcpy((*files)[i], values[i]);
        printf("%s\n", (*files)[i]);
      }
    }
    

    Después de llamar a loadList, la función main imprime las cadenas en la matriz files utilizando un bucle for y libera la memoria asignada para la matriz utilizando free(files).

    Cabe destacar que en un escenario real, puede ser mejor utilizar una estructura de datos como una lista enlazada o una matriz dinámica en lugar de una matriz estática con un tamaño fijo, y manejar errores como la asignación de memoria fallida.

Comments are closed.