在C中将内存分配给2D数组

时间:2018-11-07 06:44:17

标签: c pointers memory-management

为什么我不能分别分配2D数组的每个索引。 如果要在C中使用动态分配的数组,是否有任何正确且适当的分配内存的方法? 我收到此代码的细分错误 这是我的代码:

 typedef struct
 {
    char ***sheet;
    int columns;
    int rows;
 } SPREADSHEET;  // to access data sheet[COL][ROW]



 SPREADSHEET *createSpreadSheet(int columns, int rows) {
    if (columns <= 0 || rows <= 0){  // Disallow 0 or negative rows/columns
        return NULL;
    }
    SPREADSHEET *sp = malloc(sizeof(SPREADSHEET));
    sp->columns = columns;
    sp->rows = rows;



    for(int i=0; i<rows; i++){
        for(int j=0; j<columns; j++){
            printf("i: %i, j: %i\n", i, j);
            sp->sheet[i][j] = malloc(sizeof(char(*))+2);
        }
    }
    return sp;
 }

1 个答案:

答案 0 :(得分:1)

我认为您正在寻找的是这个

ISupportInitialize

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); 是所谓的 flexible array成员。它必须在结构的最后声明,并且保证在结构本身之后分配尾随内存时具有确定性。变量本身不会增加结构的大小。

不幸的是,C仅允许单行灵活数组成员,因此,如果您希望按情况使用它,则必须使用“混合2D数组”。这意味着我们将在运行时手动计算数组索引,以便访问数组项。

或者,您也可以通过定义明确的临时数组指针访问项目:

sheet