matriz - Asignación de memoria dinámica para matrices de punteros
punteros y matrices en c (4)
En C una cadena es un char*
. Una matriz dinámica de tipo T
se representa como un puntero a T
, por lo que para char*
sería char**
, no simplemente char*
la forma en que lo declaró.
El compilador, sin duda, ha emitido algunas advertencias al respecto. Preste atención a estas advertencias, muy a menudo le ayudan a entender qué hacer.
Aquí es cómo puede comenzar su prueba:
char **aPtr;
int len = 1; // Start with 1 string
aPtr = malloc(sizeof(char*) * len); // Do not cast malloc in C
aPtr[0] = "This is a test";
printf("%s",aPtr[0]); // This should work now.
Estoy tratando de escribir un programa que lea una serie de cadenas de un archivo de texto y las almacene en una matriz de cadenas, asignando dinámicamente la memoria para cada elemento. Mi plan era almacenar cada cadena en una matriz utilizando un puntero y luego aumentar el tamaño de la matriz a medida que se leía más. Tengo problemas para entender por qué el código de prueba que se muestra a continuación no funciona. ¿Es esta una idea viable?
char *aPtr;
aPtr =(char*)malloc(sizeof(char));
aPtr[0]="This is a test";
printf("%s",aPtr[0]);
Lo estás haciendo totalmente mal. La versión correcta de su código debería ser así:
int main ()
{
char *aPtr;
aPtr =(char*)malloc(20*sizeof(char));
aPtr ="This is a test";
printf("%s",aPtr);
}
Puede utilizar la matriz de punteros. Si desea almacenar varias cadenas. Sí, sé que usar para bucle será fácil. Pero estoy tratando de explicar de manera simple, incluso un principiante puede entender.
int main ()
{
char *aPtr[10];
aPtr[0] =(char*)malloc(20*sizeof(char));
aPtr[0] ="This is a test";
aPtr[1] =(char*)malloc(20*sizeof(char));
aPtr[1] ="This is a test2";
printf("%s/n%s/n",aPtr[0],aPtr[1]);
}
char * aPtr;
es como puntero a un carácter, al que asignó memoria para contener exactamente 1
carácter.
Obra
aPrt[0] = "test";
direcciona la memoria para estos caracteres e intenta almacenar la dirección del literal "test"
en ella. Esto fallará ya que esta dirección es probablemente más amplia que un personaje.
Una solución a su código sería asignar memoria para un puntero a un carácter.
char ** aPtr = malloc(sizeof(char *));
aPtr[0] = "test";
printf("%s", aPtr[0]);
Un enfoque más elegante y más robusto sería asignar el mismo (además de agregar la comprobación de errores obligatoria) haciendo:
char ** aPtr = malloc(sizeof *aPtr);
if (NULL == aPtr)
{
perror("malloc() failed");
exit(EXIT_FAILURE);
}
...
char *str; //single pointer
Con esto puedes guardar una cadena.
Para almacenar una array of strings
necesitas una two dimensional character array
o bien array of character pointers
o bien double pointer
char str[10][50]; //two dimensional character array
Si declara así no necesita asignar memoria ya que esta es una declaración estática
char *str[10]; //array of pointers
Aquí necesitas asignar memoria para cada puntero.
Recorrer la matriz para asignar memoria para cada puntero.
for(i=0;i<10;i++)
str[i]=malloc(SIZE);
char **str; //double pointer
Aquí debe asignar memoria para Número de punteros y luego asignar memoria para cada puntero.
str=malloc( sizeof(char *)*10);
Y luego recorra en bucle la memoria de asignación para cada puntero
for(i=0;i<10;i++)
str[i]=malloc(SIZE);