我无法关注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
++(m.p);
编译器在同一行代码中给出了另外的错误(两个),即
指向未知结构的指针的增量。
指向不完整类型的指针的算法。
请告诉我编译器为什么会出现上述错误?
我最终想要的是在结构中有一个指向2-d 动态整数数组的指针。 那么,怎么做???
答案 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] =价值;