将void**转换为int的二维数组 - C

9
我将尝试在C语言中将一个void**指针转换为int** 2D数组。
这是我正在使用的代码(已删除所有多余部分):
\*assume that i have a data structure called graph with some 
 *element "void** graph" in it and some element "int order" */

void initialise_graph_data(graph_t *graph)
{
    void **graph_data = NULL;
    int (*matrix)[graph->order];
    size_t size = (graph->order * graph->order) * sizeof(int);

    graph_data = safe_malloc(size); /*safe malloc works fine*/
    matrix = (int(*)[graph->order])graph_data;
    graph->graph = graph_data;
}

当我编译它时,它可以正常工作,但会给我一个警告,即变量“matrix”被设置但未使用。我不想使用中间矩阵变量,因为该函数只是应该初始化数组,而不是向其中放置任何内容;但是,如果我尝试在将graph_data分配给graph->graph时直接将其转换为int **,则会出现问题:
graph->graph = (int(*)[graph->order])graph_data;

我收到了一个“从不兼容的指针类型分配”的警告。

我是不是没有正确地进行转换?有没有人有任何建议,可以让我在不使用中间变量“matrix”的情况下使其正常工作?如果不行,那我该怎么处理这个变量,以免出现“已设置但未使用”的警告?

谢谢


1个回答

49

编译器是正确的,数组的数组(或指向数组的指针)与指向指针的指针不同。只需思考它们在内存中的布局:

以数组的数组形式表示的大小为MxN的矩阵:

+--------------+--------------+-----+----------------+--------------+-----+------------------+
| matrix[0][0] | matrix[0][1] | ... | matrix[0][N-1] | matrix[1][0] | ... | matrix[M-1][N-1] |
+--------------+--------------+-----+----------------+--------------+-----+------------------+

以指向指针的形式表示的相同"matrix":

+--------+ +-----------+-----------+-----------+-----+ | 矩阵 | --> | 矩阵[0] | 矩阵[1] | 矩阵[2] | ... | +--------+ +-----------+-----------+-----------+-----+ | | | | | V | | +--------------+--------------+-----+ | | | 矩阵[2][0] | 矩阵[2][1] | ... | | | +--------------+--------------+-----+ | | | V | +--------------+--------------+-----+ | | 矩阵[1][0] | 矩阵[1][1] | ... | | +--------------+--------------+-----+ | V +--------------+--------------+-----+ | 矩阵[0][0] | 矩阵[0][1] | ... | +--------------+--------------+-----+

无论您是否分配了正确的大小,这两个变量都是不兼容的,这就是编译器告诉您的信息。


3
优秀的ASCII艺术。这使得你的回答更加雄辩(和优雅)。 - Rerito
1
很好,有没有ASCII工具可以做到这一点? - artm
2
@artm 我不知道,我只是直接在这个网站的文本输入框中编写这些内容。 :) - Some programmer dude
2
手动绘制的效果令人印象深刻,看起来非常准确(所有“指针”都对齐了 :))。 - artm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接