将 void** 转换为 int 的二维数组 - C [英] casting void** to 2D array of int - C
问题描述
我正在尝试将 void** 指针转换为 C 中的 int** 2D 数组
这是我尝试使用的代码(删除了所有无关位):
*假设我有一个名为 graph 的数据结构,其中包含一些*其中的元素void** graph"和一些元素int order"*/void initialise_graph_data(graph_t *graph){无效**graph_data = NULL;int (*matrix)[graph->order];size_t size = (graph->order * graph->order) * sizeof(int);graph_data = safe_malloc(size);/*安全的malloc工作正常*/矩阵 = (int(*)[graph->order])graph_data;图->图=图数据;}
当我编译它时,它工作正常,但警告我变量矩阵"已设置但未使用.我真的不想使用临时矩阵变量,因为该函数只是应该初始化数组,而不是在其中放置任何东西;但是,如果我尝试将 graph_data 直接转换为 int**,当我将其分配给 graph->graph 时,如下所示:
graph->graph = (int(*)[graph->order])graph_data;
它给了我一个来自不兼容指针类型警告的赋值.
我只是没有正确投射吗?有没有人对我如何在没有临时矩阵"变量的情况下使其工作有任何建议?或者如果没有,我可以用那个变量做什么,这样它就不会警告我它已设置但未使用?
谢谢
编译器说的对,数组的数组(或指向数组的指针)和指向指针的指针是不一样的.想想它们在内存中的布局:
大小为 MxN 的矩阵,形式为数组数组:
<前>+--------------+--------------+-----+---------------+--------------+-----+-----+|矩阵[0][0] |矩阵[0][1] |... |矩阵[0][N-1] |矩阵[1][0] |... |矩阵[M-1][N-1] |+--------------+--------------+-----+---------------+--------------+-----+-----+A 和同一个矩阵"的指针形式:
<前>+-----------+-----------+-----------+-----+|矩阵[0] |矩阵[1] |矩阵[2] |... |+-----------+-----------+-----------+-----+|||||伏||+--------------+--------------+-----+|||矩阵[2][0] |矩阵[2][1] |... |||+--------------+--------------+-----+|||伏|+--------------+--------------+-----+||矩阵[1][0] |矩阵[1][1] |... ||+--------------+--------------+-----+|伏+--------------+--------------+-----+|矩阵[0][0] |矩阵[0][1] |... |+--------------+--------------+-----+分配大小是否正确无关紧要,这两个变量根本不兼容,这就是您的编译器告诉您的.
i am trying to cast a void** pointer to an int** 2D array in C
here is the code that i am trying to work with (with all the extraneous bits removed):
*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;
}
when i compile that, it works fine, but gives me a warning that variable 'matrix' is set but not used. i dont really want to have to use the interim matrix variable because the function is just supposed to initialise the array, not put anything in it; but if i try to cast graph_data directly to an int** when i am assiging it to graph->graph like so:
graph->graph = (int(*)[graph->order])graph_data;
it gives me an assignment from incompatible pointer type warning.
am i just not casting it properly? does anyone have any suggestions as to how i can make it work without the interim "matrix" variable? or if not, what i can do with that variable so that it doesnt give me the warning that it is set but not used?
thanks
The compiler is right, an array of arrays (or a pointer to an array) is not the same as a pointer to a pointer. Just think about how they would be laid out in memory:
A matrix of size MxN in the form of an array of arrays:
+--------------+--------------+-----+----------------+--------------+-----+------------------+ | matrix[0][0] | matrix[0][1] | ... | matrix[0][N-1] | matrix[1][0] | ... | matrix[M-1][N-1] | +--------------+--------------+-----+----------------+--------------+-----+------------------+
A and the same "matrix" in the form of pointer to pointer:
+-----------+-----------+-----------+-----+ | 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] | ... | +--------------+--------------+-----+
It doesn't matter if you allocate the correct size, the two variables simply are incompatible which is what your compiler is telling you.
这篇关于将 void** 转换为 int 的二维数组 - C的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!