Я думаю, что вы ищете это:
typedef struct
{
int columns;
int rows;
char sheet[];
} SPREADSHEET;
SPREADSHEET *sp = malloc( sizeof(SPREADSHEET) + sizeof(char[columns][rows]) );
sp->columns = columns;
sp->rows = rows;
for(size_t i=0; i<columns; i++)
{
for(size_t j=0; j<rows; j++)
{
sp->sheet[i*rows + j] = something;
}
}
...
free(sp);
Где sheet
- это так называемый гибкий элемент массива . Он должен быть объявлен последним в структуре, и он гарантированно будет вести себя детерминистически, когда вы выделяете конечную память после самой структуры. Переменная сама по себе не увеличивает размер структуры.
К сожалению, C допускает только однорядные элементы гибкого массива, поэтому вы должны использовать «искаженный 2D-массив», если хотите использовать его, как в вашем случае. Это означает, что мы вычисляем индекс массива вручную во время выполнения, чтобы получить доступ к элементам массива.
В качестве альтернативы, вы можете получить доступ к элементам через указатель временного массива, который также четко определен:
char (*arr)[rows] = (void*) sp->sheet;
for(size_t i=0; i<columns; i++)
{
for(size_t j=0; j<rows; j++)
{
arr[i][j] = something;
}
}