【问题标题】:Allocating memory to a 2D array in C在C中将内存分配给二维数组
【发布时间】:2018-11-07 06:44:16
【问题描述】:

为什么我不能单独分配二维数组的每个索引。 如果您想在 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;
 }

【问题讨论】:

  • 三颗星,两个 malloc,减一。通常,粗略的观察表明存在问题。每颗星表示一个级别的指向。对于每个级别,您都需要能够解释它指向的内存是如何分配的。请在您的问题中这样做以提高清晰度。
  • 你永远不会让sheet指向任何地方。
  • sizeof(char(*)) 是指向char指针 的大小。这等于48(取决于32 位或64 位系统)。如果您想要三个字符的空间(包括空终止符),那么这只是3

标签: c pointers memory-management


【解决方案1】:

我认为您正在寻找的是:

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 只允许单行灵活的数组成员,所以如果你想在你的情况下使用它,你必须使用“mangled 2D array”。这意味着我们在运行时手动计算数组索引,以便访问数组项。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-12
    • 1970-01-01
    • 1970-01-01
    • 2012-02-05
    • 1970-01-01
    • 2016-06-21
    • 2013-02-10
    • 1970-01-01
    相关资源
    最近更新 更多