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>
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ámetrofiles
es un puntero a un puntero dechar
, yfilesSize
es un puntero aint
.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 buclefor
itera sobre los elementos de la matriz y cada elemento se agrega a la matrizfiles
.Dentro del bucle, se utiliza
realloc
para redimensionar la matrizfiles
y que contengai+1
elementos. Luego, se utilizamalloc
para asignar memoria para cada cadena ystrcpy
para copiar el literal de cadena devalues
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:
Después de llamar a
loadList
, la funciónmain
imprime las cadenas en la matrizfiles
utilizando un buclefor
y libera la memoria asignada para la matriz utilizandofree(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.