He declarado una matriz char ** arr; Cómo inicializar la memoria para la matriz de caracteres 2D.memoria dinámica para matriz de caracteres 2D
Respuesta
Hay dos opciones para asignar una matriz de tipo char **
He transcrito estos 2 ejemplos de código de la comp.lang.c FAQ (que también contiene una buena ilustración de estos dos tipos de matriz)
Opción 1 - Realice una asignación por fila más uno para los punteros de fila.
char **array1 = malloc(nrows * sizeof(char *)); // Allocate row pointers
for(i = 0; i < nrows; i++)
array1[i] = malloc(ncolumns * sizeof(char)); // Allocate each row separately
Opción 2 - Asignar todos los elementos juntos y asignar los punteros de fila:
char **array2 = malloc(nrows * sizeof(char *)); // Allocate the row pointers
array2[0] = malloc(nrows * ncolumns * sizeof(char)); // Allocate all the elements
for(i = 1; i < nrows; i++)
array2[i] = array2[0] + i * ncolumns;
También puede asignar solamente un bloque de memoria y utilizar un poco de aritmética para obtener en el elemento [i,j]
. Pero entonces usaría un char*
no como char**
y el código se complicaría. p.ej. arr[3*ncolumns + 2]
en lugar de arr[3][2]
Una forma es hacer lo siguiente:
char **arr = (char**) calloc(num_elements, sizeof(char*));
for (i = 0; i < num_elements; i++)
{
arr[i] = (char*) calloc(num_elements_sub, sizeof(char));
}
Es bastante claro lo que está pasando aquí - en primer lugar, está la inicialización de una matriz de punteros, entonces para cada puntero en esta matriz se están asignando una serie de personajes.
Puede resumir esto en una función. Tendrá que liberar() ellos también, después de su uso, así:
for (i = 0; i < num_elements; i++)
{
free(arr[i]);
}
free(arr);
Creo que esto de la manera más fácil de hacer las cosas y coincide con lo que necesita.
Usaría "* arr" en lugar de "char *" para la primera calloc. Y "** arr" en lugar de "char" para el calloc en el ciclo. –
Al hacer múltiples asignaciones, la memoria no será continua. Funcionará bien al incrementar un puntero para acceder al valor. – Ankur
@Ankur solo con una * fila * del arreglo 2D –
Usted puede ser mejor con una matriz unidimensional:
char *arr = calloc(WIDTH*HEIGHT, sizeof(arr[0]));
for (int y=0; y<HEIGHT; y++)
for (int x=0; x<WIDTH; x++)
arr[WIDTH*y+x] = 2*arr[WIDTH*y+x];
free(arr);
utilizar el siguiente truco:
typedef char char2D[1][1];
char2D *ptr;
ptr = malloc(rows * columns, sizeof(char));
for(i = 0; i < rows; i++)
for(j = 0; j < columns; j++)
(*ptr)[i][j] = char_value;
char **array;
int row,column;
char temp='A';
printf("enter the row");
scanf("%d",&row);
printf("enter the column");
scanf("%d",&column);
array=(char **)malloc(row*sizeof(char *));
for (int i=0;i<row;i++)
{
array[i]=(char*)malloc(column*sizeof(char));
}
Por matriz de caracteres 2D, si se refiere a una matriz de cadenas a continuación, se puede hacer de la siguiente manera.
int nChars = 25; // assuming a max length of 25 chars per string
int nRows = 4;
int nCols = 6;
char *** arr = malloc(nRows * sizeof(char **));
int i;
int j;
for(i = 0; i < nCols; ++i)
{
arr[i] = malloc(nCols * sizeof(char *));
}
for(i = 0; i < nRows; ++i)
{
for(j = 0; j < nCols; ++j)
{
arr[i][j] = malloc(nChars * sizeof(char));
sprintf(arr[i][j], "Row %d Col %d", i, j);
}
}
Para imprimir la matriz 2D char (matriz de cadenas (arrays carbón de leña))
for(i = 0; i < nRows; ++i)
{
for(j = 0; j < nCols; ++j)
{
printf("%s ", arr[i][j]);
}
printf("\n");
}
resultado es
Row 0 Col 0 Row 0 Col 1 Row 0 Col 2 Row 0 Col 3 Row 0 Col 4 Row 0 Col 5
Row 1 Col 0 Row 1 Col 1 Row 1 Col 2 Row 1 Col 3 Row 1 Col 4 Row 1 Col 5
Row 2 Col 0 Row 2 Col 1 Row 2 Col 2 Row 2 Col 3 Row 2 Col 4 Row 2 Col 5
Row 3 Col 0 Row 3 Col 1 Row 3 Col 2 Row 3 Col 3 Row 3 Col 4 Row 3 Col 5
- 1. ¿Cómo se almacena una matriz 2D dinámica en la memoria?
- 2. asignación dinámica de memoria para la matriz 3D
- 3. Asignación de memoria dinámica
- 4. ¿Puede una matriz 2D dinámica implementar el método Java.Collection.size()?
- 5. Buscando 'burbujas' en una matriz 2D de caracteres en Java
- 6. Uso de la asignación de memoria dinámica para matrices
- 7. asignación dinámica de la memoria
- 8. CUDA: memoria compartida en una matriz bidimensional 2D
- 9. creando una matriz bidimensional de forma dinámica en el bloque de memoria continua
- 10. ¿Cuál es el diseño de memoria de una matriz dinámica Delphi de una matriz dinámica de X?
- 11. F # Crear matriz 2D
- 12. Transponer una matriz 2D
- 13. Algoritmo de Dijkstra con una matriz 2d
- 14. Pregunta de matriz 2D Java
- 15. 2d iteración de matriz scala
- 16. Asignación dinámica de memoria pregunta
- 17. 2D memoria compartida dispuesta en CUDA
- 18. representación de una matriz 2D como una matriz 1D
- 19. asignación/desasignación dinámica de matrices en 2D y 3D
- 20. teclas matriz dinámica
- 21. Asignación dinámica de memoria constante en CUDA
- 22. Cómo aplanar matriz 2D a matriz 1D?
- 23. ¿Matriz dinámica en pila?
- 24. ¿Ordenar una matriz 2D binaria?
- 25. Cómo crear una matriz dinámica
- 26. matriz dinámica de punteros a estructuras
- 27. Atravesar una matriz F # 2D
- 28. acceso directo para crear matriz de caracteres
- 29. sizeof para una matriz de caracteres
- 30. Inicializando matriz 2D en Python
http://c-faq.com/~scs/ cclass/int/sx9b.html – Yktula