dynamic memory for 2D char array

I have declared an array char **arr; How to initialize the memory for the 2D char array.

1

6 Answers

One way is to do the following:

char **arr = (char**) calloc(num_elements, sizeof(char*));
for ( i = 0; i < num_elements; i++ )
{ arr[i] = (char*) calloc(num_elements_sub, sizeof(char));
}

It's fairly clear what's happening here - firstly, you are initialising an array of pointers, then for each pointer in this array you are allocating an array of characters.

You could wrap this up in a function. You'll need to free() them too, after usage, like this:

for ( i = 0; i < num_elements; i++ )
{ free(arr[i]);
}
free(arr);

I think this the easiest way to do things and matches what you need.

4

There are two options for allocating an array of type char **

I've transcribed these 2 code samples from the comp.lang.c FAQ (which also contains a nice illustration of these two array types)

Option 1 - Do one allocation per row plus one for the row pointers.

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

Option 2 - Allocate all the elements together and allocate the row pointers:

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;

You can also allocate only one memory block and use some arithmetic to get at element [i,j]. But then you'd use a char* not a char** and the code gets complicated. e.g. arr[3*ncolumns + 2] instead of arr[3][2]

You might be better off with a one dimensional array:

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

Use the following trick:

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

By 2D char array, if you mean a matrix of strings then it may be done in the following way.

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

To print the 2D char array(matrix of strings(char arrays))

for(i = 0; i < nRows; ++i)
{ for(j = 0; j < nCols; ++j) { printf("%s ", arr[i][j]); } printf("\n");
}

Result is

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 

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

You Might Also Like