2010-04-10 21 views

Respuesta

6

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]

7

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.

+1

Usaría "* arr" en lugar de "char *" para la primera calloc. Y "** arr" en lugar de "char" para el calloc en el ciclo. –

+0

Al hacer múltiples asignaciones, la memoria no será continua. Funcionará bien al incrementar un puntero para acceder al valor. – Ankur

+0

@Ankur solo con una * fila * del arreglo 2D –

3

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

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

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 
Cuestiones relacionadas