【发布时间】:2014-01-28 01:46:18
【问题描述】:
所以我试图定义一个通用的 ADT。 我有一个看起来像这样的结构:
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;
}
相当基本的功能。 所以我没有做的是稍后从这个数组中读取,似乎无法访问任何数据。 这就是我尝试的方式:
void PrintInt(grid* grid){
int i, j, add = 0;
for (i = 0; i < grid->xDim; i++){
for (j = 0; j < grid->yDim; j++){
add = i*(grid->xDim-1) + j;
printf("%d ", *((int*)grid->table+add)); <--- PROBLEM
}
printf("\n");
}
}
这就是这一切的主要发生方式:
grid1 = CreateGrid((*CreateInt), xDim, yDim, startX, startY, endX, endY);
PrintInt(grid1);
我得到的是 100% 的胡言乱语,有什么想法吗?
【问题讨论】:
-
请用您使用的语言标记。
-
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元素。我不知道这是否是您打算做的,但如果不是,那么这就是它不起作用的原因。
标签: c pointers void void-pointers