【问题标题】:C: Reading int** from void*C: 从 void* 读取 int**
【发布时间】: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-&gt;tablemalloc()的返回类型)。
  • 您是否尝试过int** arr = (int**)(grid-&gt;table) 并在此之后使用arr
  • @FelixKreuk 您可以按照您展示的方式访问它:grid-&gt;table。如果您将它分配给一个指向适当类型的指针,例如int **p = grid-&gt;table;,那么您可以像它是您的原始指针一样对其进行索引(因为它)。这里没有什么神奇的。
  • @FelixKreuk 也许是运算符优先级(和/或对指针运算的误解)? (int **)grid-&gt;table + index 会将原始指针增加index 单位并取消引用它以获得int *,这需要另一个级别的间接来获取您的int 元素。我不知道这是否是您打算做的,但如果不是,那么这就是它不起作用的原因。

标签: c pointers void void-pointers


【解决方案1】:
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");
    }
}

【讨论】:

  • 不能用于void *类型的加减法。 (尽管可能会出现预期实施的情况。)
猜你喜欢
  • 1970-01-01
  • 2011-06-28
  • 1970-01-01
  • 2016-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-16
  • 2023-03-13
相关资源
最近更新 更多