我很好奇,为什么我不能传递char **给const char **函数?在传递char *给const char *函数的情况下,使用双指针执行它似乎不行.我认为添加常量总是可以的(但不能删除常量)但现在看来我错了.
Gcc编译器给我错误的错误:
note: expected ‘const char **’ but argument is of type ‘char **’
Run Code Online (Sandbox Code Playgroud)
这是代码片段:
int f(const char **a) { }
int main() {
char *a;
f(&a);
}
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
jam*_*lin 18
因为编译器不能保证安全.
请参阅comp.lang.c中的Q11.10 FAQ:为什么我不能将a传递char **给期望的函数const char **?
假设您执行了以下更复杂的分配系列:
Run Code Online (Sandbox Code Playgroud)const char c = 'x'; /* 1 */ char *p1; /* 2 */ const char **p2 = &p1; /* 3 */ *p2 = &c; /* 4 */ *p1 = 'X'; /* 5 */在第3行中,我们将a分配
char **给aconst char **.(编译器应该抱怨.)在第4行,我们分配aconst char *到aconst char *; 这显然是合法的.在第5行,我们修改了char *要点 - 这应该是合法的.然而,p1最终指向c,这是const.这是第4行,因为*p2真的p1.这是在第3行中设置的,它是一个不允许的表单的赋值,这正是为什么不允许第3行的原因.将a分配
char **给const char **(如第3行和原始问题中)并不是立即危险的.但它确立了一种情况,即p2承诺 - 最终指向的价值不会被修改 - 无法保留.
| 归档时间: |
|
| 查看次数: |
1753 次 |
| 最近记录: |