Boardy
Boardy

Reputation: 36205

Initialising 2d dynamic Array

I am new to C and trying to initialise a 2D array. I need both columns of the array to be char *, as they will contain string values.

I have it working with the array storing ints but for some reason, when I try to store string values when it prints it displays (null). Below is the code for how I am initialising and storing the data as an int (This appears to be working).

int **array;
    int row = 0;

    array = malloc(2 * sizeof(int*));
    int i;
    for (i = 0; i < 2; i++)
    {
        array[i] = malloc(2 * sizeof(int));
    }

    array[0][0] = i;
    array[0][1] = i;

    printf("array[0][0]: %i\n", array[0][0]);

Below is how I am doing the above but using string values instead.

char **array;
int row = 0;

array = malloc(2 * sizeof(char*));
int i;
for (i = 0; i < 2; i++)
{
    array[i] = malloc(2 * sizeof(char*));
}

array[0][0] = "Test[0][0]";
array[0][1] = "Test[0][1]";

printf("array[0][0]: %s\n", array[0][0]);

Thanks for any help you can provide.

Upvotes: 1

Views: 168

Answers (2)

unwind
unwind

Reputation: 399793

You have the wrong level of pointer indirection, which is over-complicating things.

I think it would be easier for you if you thought of the array as an array of structures, each structure holding two pointers:

struct row {
  char *column1;
  char *column2;
};

then it's (hopefully) clearer that once you've allocated an array of struct row, you have two pointers in each row, you don't need to allocate room for the pointers themselves.

const size_t num_rows = 1;
struct row * rows = malloc(num_rows * sizeof *rows);
if(rows != NULL)
{
  rows[0].column1 = "row 0, column 1";
  rows[0].column2 = "row 1, column 2";
}

Note that this uses string literals, otherwise you might need to allocate room for the strings to be stored, depending on where the data comes from.

The num_rows value could of course come from anywhere in your program, I'm just trying to illustrate what controls the number of rows memory is allocated for.

Upvotes: 3

user2088790
user2088790

Reputation:

Save yourself the trouble and don't use 2D arrays in C. It's more convenient to use 1D arrays.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
    const int nstrings = 2;
    const int width = 20; //width of maximum string.

    char* array = (char*)malloc(sizeof(char)*nstrings*width);
    strcpy(&array[0*width],"Test[0][0]");
    strcpy(&array[1*width],"Test[1][0]");
    printf("string 0: %s\n", &array[0*width]); 
    printf("string 1: %s\n", &array[1*width]);
    free(array);
}

Upvotes: 1

Related Questions