我正在尝试定义一个这样的矩阵 我有一个结构
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
我做错了什么?我应该发布实际代码吗?如果这种方法不可行,我可以得到不同的建议吗?
更新:我再说一遍,矩阵全是int,我只想让最后一行指向那个结构,有些评论没有考虑到这一点。这就是我在我的例子中所说的方式。
答案 0 :(得分:2)
让我们开始简单:
您想要创建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]);
}
}
无论哪种方式,要访问i
'和j
'元素的结构成员,你都会写:
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 = ...;
但正如我上面所说,如果指针类型不兼容,转换可能会导致运行时错误。不要这样做。坏juju。
答案 1 :(得分:1)
您应该将指针转换为适当的类型:
int val = ((MyDataType *)myMatrix[last_index_in_matrix])->data
否则你试图在data
中找到一个名为int *
的字段,当然这是无法完成的。或者,将myMatrix
声明为MyDataType **
。
答案 2 :(得分:0)
以下是使用malloc()
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define ROW 10
#define COL 10
int main(void)
{
char **arr = NULL;
int i;
if ((arr = malloc(sizeof(char *) * ROW)) == NULL) {
printf("unable to allocate memory \n");
return -1;
}
for (i=0; i<ROW ; i++) {
if ((arr[i] = malloc(sizeof(char) * COL)) == NULL) {
printf("unable to allocate memory \n");
return -1;
}
}
/* here you can use arr[][] */
for (i=0; i<ROW ; i++)
free(arr[i]);
free(arr);
return 0;
}
OTOH,要访问以下结构成员变量,您可以使用以下方法
typedef struct _struct {
int name;
int data;
} myDataType;
选项#1
/* creating auto variable of type myDataType which gets allocated in stack */
myDataType mdt;
/* to access the member variables, you need to do the following */
mdt.data = 10
选项#2
/* creating a pointer variable of type myDataType
and allocating memory from heap using malloc() */
myDataType *pmdt = NULL;
if ((pmdt = malloc(sizeof(myDataType) * numberofelements)) == NULL) {
printf("unable to allocate memory \n")
return -1;
}
/* to access the member variables using the pointer, you need to do the following */
pmdt->data = 100;
/* finally you should free the memory allocated using malloc() using free() */
free(pmdt);
希望它有所帮助!
根据OP作者的要求,将上述两个程序合并为一个。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define ROW 10
#define COL 10
typedef struct _struct {
int data;
} myDataType;
int main(void)
{
myDataType **arr = NULL;
int i, j;
int val = 0;
if ((arr = malloc(sizeof(myDataType *) * ROW)) == NULL) {
printf("unable to allocate memory \n");
return -1;
}
for (i=0; i<ROW ; i++) {
if ((arr[i] = malloc(sizeof(myDataType) * COL)) == NULL) {
printf("unable to allocate memory \n");
return -1;
}
}
/* Now, I'm setting some value to each
and every element in the 2d matrix */
for (i=0; i<ROW ; i++)
for (j=0; j<COL ; j++)
arr[i][j].data = val++;
/* Now, I'm printing those values */
for (i=0; i<ROW ; i++)
for (j=0; j<COL ; j++)
printf("arr[%d][%d].data = %d \n", i, j, arr[i][j].data);
for (i=0; i<ROW ; i++)
free(arr[i]);
free(arr);
return 0;
}