将void **转换为int – C的二维数组
我试图将一个void **指针投射到C中的一个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; }
当我编译,它工作正常,但给我一个警告,variables“matrix”设置,但没有使用。 我真的不想要使用临时matrixvariables,因为该函数只是初始化数组,而不是放入任何东西; 但是如果我尝试直接将graph_data投射到int **时,我将它指定为graph-> graph,如下所示:
graph->graph = (int(*)[graph->order])graph_data;
它给了我一个不兼容的指针types警告的任务。
我只是没有正确的施放? 有没有人有任何build议,如何我可以使其工作没有临时“matrix”variables? 或者如果不是的话,我可以用这个variables做些什么,这样它就不会给我警告,说它已经被设置但是没有被使用?
谢谢
编译器是正确的,一个数组数组(或一个指向数组的指针)与指向指针的指针是不一样的。 想一想如何在记忆中进行布局:
一个大小为MxN的matrix,其forms为数组:
+ -------------- -------------- + + ----- + ------------- --- + -------------- + ----- + ------------------ + | matrix[0] [0] | matrix[0] [1] | ... | matrix[0] [N-1] | matrix[1] [0] | ... | matrix[M-1] [N-1] | + -------------- -------------- + + ----- + ------------- --- + -------------- + ----- + ------------------ +
A和指针指针forms的相同“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] | ... | + -------------- -------------- + + ----- +
分配正确的大小并不重要,这两个variables是不兼容的,这是你的编译器告诉你的。