c - C中具有混合数据类型的指针矩阵

标签 c

我正在尝试像这样定义一个矩阵 我有一个结构

typedef struct _struct {
  int name;
  int data;
} myDataType;

然后我定义一个矩阵

int **myMatrix = calloc(size,sizeof(int*));
for()
   // allocate rows except last index
myMatrix[last_index_in_matrix] = calloc(1,sizeof(myDataType));

问题是我无法访问它说的 myMatrix[last_index].data,也尝试过 -> (我真的不知道什么时候使用什么)

request for member ‘data’ in something not a structure or union

我做错了什么?我应该发布实际代码吗?如果这种方法不可行,我可以得到不同的建议吗?

更新:我再说一遍,矩阵都是整数,我只想让最后一行指向那个结构,一些评论没有考虑到这一点。这就是我在示例中声明它的方式。

最佳答案

让我们从简单的开始:

您想创建一个 myDataType 矩阵。如果你在编译时知道行数和列数,你可以简单地声明为

myDataType matrix[ROWS][COLS];

如果你需要动态分配它,你会做这样的事情:

myDataType **matrix;

matrix = calloc(rows, sizeof *matrix);
if (matrix)
{
  size_t r;
  for (r = 0; r < rows; r++)
  {
    matrix[r] = calloc(cols, sizeof *matrix[r]);
  }
}

无论哪种方式,要访问第 ij 元素的结构成员,您将编写:

matrix[i][j].name = ...;
matrix[i][j].data = ...;

编辑

啊,我明白了。

不要那样做。

无法保证指向 struct 类型的指针与指向 int 的指针具有相同的大小和表示形式。它们适用于最常见的架构,但这不是您可以依赖的东西。如果他们不这样做,那么您将遇到运行时问题。

从设计的角度来看,这让我很痒;如果您需要将该结构与矩阵相关联,请创建一个新的聚合类型来明确地这样做:

struct composite
{
  int **matrix;
  struct myData data;
};

当您还需要释放矩阵时,这将使生活更轻松。

FWIW,为了做你想做的事,你需要进行一些类型转换体操,比如

(struct myData *) myMatrix[last_index] = malloc(sizeof (struct myData));

((struct myData *) myMatrix[last_index])->data = ...;

但正如我上面所说,如果指针类型不兼容,转换可能会导致运行时错误。不要这样做。坏枣。

关于c - C中具有混合数据类型的指针矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8840363/

相关文章:

c++ - 混合 C 和 C++ 代码时, main() 是否需要在 C++ 部分?

c - C中的 "x"和 "&x[0]"有什么区别吗?

c - #include 是关键字类型的标记吗?

c - 我如何指定在哪个方向舍入两个与其有效数的 LSB 不同的 float 的平均值?

c++ - 内存/速度问题的一般策略

C 程序卡住,不进入 main()

#define 之外的 C 预处理器连接

c - 对 SMC 调用的 Svc 处理程序

c - C中的初始化部分

c - 如何将字符串复制到 C 中的数组?