提问人:guskenny83 提问时间:8/26/2013 最后编辑:Guy Avrahamguskenny83 更新时间:9/23/2023 访问量:3841
将 void** 转换为 int - C 的 2D 数组
casting void** to 2D array of int - C
问:
我正在尝试在 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;
}
当我编译它时,它工作正常,但给我一个警告,变量已设置但未使用。我真的不想使用临时矩阵变量,因为该函数只是应该初始化数组,而不是在其中放置任何东西;但是,如果我尝试在吸收它时直接投射到一个:matrix
graph_data
int**
graph->graph
graph->graph = (int(*)[graph->order])graph_data;
它给了我一个来自不兼容指针类型警告的分配。
我只是没有正确投射它吗?有没有人对我如何在没有临时“矩阵”变量的情况下使其工作有任何建议?或者,如果没有,我可以对该变量做什么,以便它不会给我设置但未使用的警告?
谢谢
答:
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
评论
void **
转换为int
。