0
votes

I am making a C function to integrate into Python that basically creates a two-dimensional array of chars (each row has constant, known length), reads some data into it, builds a numpy array from it, and returns it to the calling function in Python. I'm not an expert with C, but I believe that in order to preserve the array in memory after exiting the function where it was created, I need to allocate it on the heap with malloc. So I am trying this line:

//rowSize and interleaved are both integers; bytesPerTable is equal to rowSize * interleaved
char arrs[interleaved][rowSize] = (char **)malloc(bytesPerTable * sizeof(char));

Which gives me the compiler error

error: variable-sized object may not be initialized

I'm not sure how to make this work. I want to allocate a block of memory that is the size I need (bytesPerTable) and then organize it into the required two-dimensional array. If I simply declare

char arrs[interleaved][rowSize];

Then it works, but it's on the stack rather than the heap. Can anyone help?

3

3 Answers

2
votes

Do it like this

char (*arrs)[rowSize] = malloc(bytesPerTable);

arrays can't be assigned to, pointers and arrays are really different kinds of objects.

Also:

  • don't cast the return of malloc
  • sizeof(char) is 1 by definition
2
votes

What you need is this:

char** arrs = (char **)malloc(interleaved * sizeof(char*));
for(i = 0; i < bytesPerTable; i++)
    arrs[i] = (char*)malloc(rowSize * sizeof(char));

This: char arrs[interleaved][rowSize]; is just a typical stack allocation.

0
votes

You need to alloc it to a pointer, then you can cast it as an array.