Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C:从void读取int***_C_Pointers_Void_Void Pointers - Fatal编程技术网

C:从void读取int***

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

因此,我试图定义一个通用的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;
}
我得到的是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");
    }
}