suma punteros puntero memoria matriz matrices dinamico dinamica declarar con como arreglo apuntadores c arrays dynamic-memory-allocation pointer-to-pointer

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);