如何在c struct中访问指向二维数组的指针?

时间:2016-02-07 09:55:15

标签: c arrays pointers struct

我无法关注struct将其用作Matrix

  struct{
         int col;
         int row;
         int (*p)[col];//In this line compiler is giving error, saying col undeclared here.
  }Matrix;

我在互联网上搜索,我找到了一个写的解决方案

  int (*p)[col] 

作为

 int (*p)[]

编译器通过它,没有问题。

但是当我想用Matrix变量说m

来增加p时
++(m.p);

编译器在同一行代码中给出了另外的错误(两个),即

指向未知结构的指针的增量。
指向不完整类型的指针的算法。

请告诉我编译器为什么会出现上述错误?

我最终想要的是在结构中有一个指向2-d 动态整数数组的指针。 那么,怎么做???

3 个答案:

答案 0 :(得分:2)

如果您真的想要一个指向更改的任意2d数组的指针,则必须使用void指针。 (我不推荐它,它不安全,设计应该改变。)

struct
{
     int col;
     int row;
     void* p;
}

在访问内存之前,请使用局部可变长度数组指针。获取结构中的void指针,并为其分配 本地vla指针,使用结构中的信息:

struct Matrix x = ...;

int (*n)[x.col] = x.p;

然后使用它:

n[0][0] = ... 

如果要增加struct中的void指针,只需递增本地指针,并将其指定回void指针:

n++;
x.p = n;

不需要强制转换,只需要声明本地指针。如果这是一个麻烦,可以使用内联函数抽象结构中的void指针操作。这也应该是为了安全起见。

答案 1 :(得分:1)

字段声明int (*p)[col];无效,因为编译器不知道 col 的值。你需要的是指向指针int **p的指针,其中 p [ i ]指定 i :二维数组。

这是一个带有方便的内存分配宏的完整示例:

#include <stdlib.h>

#define NEW_ARRAY(ptr, n) (ptr) = calloc((n) * sizeof (ptr)[0], sizeof (ptr)[0])

struct Matrix {
    int rows;
    int cols;
    int **items;
};

void InitializeMatrix(int rows, int cols, struct Matrix *A)
{
    int i;

    A->rows = rows;
    A->cols = cols;
    NEW_ARRAY(A->items, rows);
    for (i = 0; i < rows; i++) {
        NEW_ARRAY(A->items[i], cols);
    }
}


int main(void)
{
    struct Matrix A;

    InitializeMatrix(10, 20, &A);
    return 0;
}

答案 2 :(得分:0)

声明数组时,需要单独分配内存。

struct Matrix{
         int col;
         int row;
         int  *Matrix[100];
      };

更灵活:

struct Matrix{
         int col;
         int row;
         int  **Matrix;
      }


struct Matrix A;

A.col =10;
A.row = 10;

/ *为Matrix * /

分配内存

您可以使用不同的方法为2D数组声明和分配内存。

/ *访问Matrix * /     A.Matrix [i] [j] =价值;