我有以下代码:
/*
* Pointer to a function that reads a codesegment
*/
typedef bool (*BRCS)(void *, uint32, uint64 *, uint64 *, const char **, const char **);
BRCS get_prog_id;
/*
* 'get_prog_id' is loaded from a dynamic library
*/
uint64 start_o;
uint64 length_o;
char prog_id[256];
char err[256];
get_prog_id(NULL, 0, &start_o, &length_o, &prog_id, &err);
当我运行编译器时,我收到以下警告:
passing argument 5 of get_prog_id from incompatible pointer type
passing argument 6 of get_prog_id from incompatible pointer type
所以,我抱怨说我的最后两个论点没有char **
。
我很困惑。我的理解是,表示TYPES
数组的变量等同于指向TYPE
的指针。因此,应用&
运算符会为您指向指向TYPE
的指针。
我在这里缺少什么?
答案 0 :(得分:2)
这里有两个问题:
<强>(1)强>
&prog_id
的类型不是char *
,而是char (*)[256]
;即指向char-array-of-length-256。
<强>(2)强>
即使您可以获得char **
(例如char *prog_id = malloc(256); &prog_id
),但char **
与const char **
不兼容,原因有点模糊。最好的解释是:http://c-faq.com/ansi/constmismatch.html。
答案 1 :(得分:1)
指针和数组类型仅相当于一个级别。每当另一层次的间接发挥作用时,它们就会不再相同。
如果您考虑在这种情况下应该使用什么指针算法,那么理解这是最简单的。请考虑以下定义:
typedef char tenchars[10];
tenchars *x;
现在,&(x[1])
(即x+1
)应该表示“x
加上10个字符的地址”,对吧?但是,如果我执行以下操作会怎么样:
char **y = (char **)x;
&(y[1])
现在意味着什么?为什么?
换句话说:指针数组与数组数组不同。因此,指向指针的指针与指向数组的指针不同。