C中混合数据类型的指针矩阵

时间:2012-01-12 18:32:16

标签: 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

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

更新:我再说一遍,矩阵全是int,我只想让最后一行指向那个结构,有些评论没有考虑到这一点。这就是我在我的例子中所说的方式。

3 个答案:

答案 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()

动态分配2d矩阵的方法
#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;
}