将 void** 转换为 int - C 的 2D 数组

casting void** to 2D array of int - C

提问人:guskenny83 提问时间:8/26/2013 最后编辑:Guy Avrahamguskenny83 更新时间:9/23/2023 访问量:3841

问:

我正在尝试在 C 中投射指向 2D 数组的指针void**int**

这是我尝试使用的代码(删除了所有无关的位):

/*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;
}

当我编译它时,它工作正常,但给我一个警告,变量已设置但未使用。我真的不想使用临时矩阵变量,因为该函数只是应该初始化数组,而不是在其中放置任何东西;但是,如果我尝试在吸收它时直接投射到一个:matrixgraph_dataint**graph->graph

graph->graph = (int(*)[graph->order])graph_data;

它给了我一个来自不兼容指针类型警告的分配。

我只是没有正确投射它吗?有没有人对我如何在没有临时“矩阵”变量的情况下使其工作有任何建议?或者,如果没有,我可以对该变量做什么,以便它不会给我设置但未使用的警告?

谢谢

c 转换 多维数组 void-pointers

评论

1赞 Jonathan Leffler 8/27/2013
另请参见在 C 中从 void ** 转换为 int

答:

49赞 Some programmer dude 8/26/2013 #1

编译器是对的,数组的数组(或指向数组的指针)与指向指针的指针不同。想想它们在记忆中的布局方式:

大小为 MxN 的矩阵,采用数组数组的形式:

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

A 和相同的“矩阵”,以指针到指针的形式:

+--------+     +-----------+-----------+-----------+-----+
| matrix | --> | matrix[0] | matrix[1] | matrix[2] | ... |
+--------+     +-----------+-----------+-----------+-----+
                 |           |           |
                 |           |           V
                 |           |           +--------------+--------------+-----+
                 |           |           | matrix[2][0] | matrix[2][1] | ... |
                 |           |           +--------------+--------------+-----+
                 |           |
                 |           V
                 |           +--------------+--------------+-----+
                 |           | matrix[1][0] | matrix[1][1] | ... |
                 |           +--------------+--------------+-----+
                 |
                 V
                 +--------------+--------------+-----+
                 | matrix[0][0] | matrix[0][1] | ... |
                 +--------------+--------------+-----+

分配正确的大小并不重要,这两个变量根本不兼容,这就是编译器告诉你的。

评论

3赞 Rerito 8/27/2013
优秀的ASCII艺术。这使您的回答雄辩(且优雅)
1赞 artm 12/4/2015
很好,有没有 ASCII 工具可以做到这一点?
2赞 Some programmer dude 12/4/2015
@artm 不知道,我只是直接在网站上的文本输入框中写下这些东西。:)
2赞 artm 12/4/2015
对于手动绘制来说令人印象深刻,它看起来非常准确(所有正确对齐:)pointers