C:从void读取int***
因此,我试图定义一个通用的ADT。 我有一个结构,看起来像这样:C:从void读取int***,c,pointers,void,void-pointers,C,Pointers,Void,Void Pointers,因此,我试图定义一个通用的ADT。 我有一个结构,看起来像这样: struct grid_type{ void* table; int startX, startY, endX, endY, xDim, yDim; }; 正如您所看到的,我有一个void指针,它应该能够存储各种数据类型。 对于此实例,我试图指向此函数返回的int**(二维数组): int** CreateInt(int xDim, int yDim){ int** table = NULL; i
struct grid_type{
void* table;
int startX, startY, endX, endY, xDim, yDim;
};
正如您所看到的,我有一个void指针,它应该能够存储各种数据类型。
对于此实例,我试图指向此函数返回的int**(二维数组):
int** CreateInt(int xDim, int yDim){
int** table = NULL;
int i, j;
table = (int**)malloc(xDim*sizeof(int*));
if (table == NULL){
puts("failed malloc");
exit(1);
}
for (i = 0; i < xDim; i++){
table[i] = (int*)malloc(yDim*sizeof(int));
if (table[i] == NULL){
puts("failed malloc");
exit(1);
}
for (j = 0; j < yDim; j++){
table[i][j] = 1;
}
}
return table;
}
我得到的是100%的jibrish,有什么想法吗?void PrintInt(网格*grid){
void PrintInt(grid* grid){
int i, j;
int **table = grid->table;
for (i = 0; i < grid->xDim; i++){
for (j = 0; j < grid->yDim; j++){
printf("%d ", table[i][j]);
}
printf("\n");
}
}
int i,j;
int**table=网格->表格;
对于(i=0;ixDim;i++){
对于(j=0;jyDim;j++){
printf(“%d”,表[i][j]);
}
printf(“\n”);
}
}
请使用您正在使用的语言进行标记。int**
不是二维数组。另外,不要强制转换void*
(这包括grid->table
和malloc()
)的返回类型。您是否尝试过int**arr=(int**)(grid->table)
,然后使用arr
。@FelixKreuk您可以按照显示的方式访问它:grid->table
。如果将其分配给指向适当类型的指针,例如int**p=grid->table代码>,然后您可以将其作为原始指针进行索引(因为它是原始指针)。这里没有什么神奇之处。@FelixKreuk可能是运算符优先级(和/或对指针算术的误解)(int**)grid->table+index
将原始指针按index
单位递增,并将其解引用以获得int*
,这需要另一个间接级别才能到达int
元素。我不知道你是否打算这么做,但如果不是,那么这就是为什么它不起作用的原因。它不能用于类型void*
的加减运算。(尽管在某些情况下,它的运作可能是为了期望实施。)
grid1 = CreateGrid((*CreateInt), xDim, yDim, startX, startY, endX, endY);
PrintInt(grid1);
void PrintInt(grid* grid){
int i, j;
int **table = grid->table;
for (i = 0; i < grid->xDim; i++){
for (j = 0; j < grid->yDim; j++){
printf("%d ", table[i][j]);
}
printf("\n");
}
}