为什么这允许从(char *)到(const char *)的升级?

时间:2009-04-19 23:31:52

标签: c

鉴于scanf在documentation from Microsoft中有(const char *)和this question的答案,当我为(char **)提升(const char *)做同样的事情时,我的目标是什么*)?

基本上为什么编译?

#include <stdio.h>
int main(int argc, char **argv)
{   
    char szArray[50];
    int  i = 0;
    strcpy(szArray,"10");
    /* the following code is upcasting the (char *) to (const char *) */
    sscanf(szArray,"%d",&i);
    return 0;  
}

为什么不编译?

#include <stdio.h>
void processargs(const char **p)
{ 
}
int main(int argc, char **argv)
{
    processargs(argv);          
    return 0;  
}

两者似乎对指针做了同样的事情!

4 个答案:

答案 0 :(得分:12)

char** -> const char **很危险,因为您最终可能会意外修改基础const对象。

写出你想要的东西的正确方法是:

void processargs(const char * const *p)
{ 
}

答案 1 :(得分:3)

您可以增加访问限制,但您无法减少访问限制。从普通指针到const指针很好,从const指针到普通指针不是。

第二个示例没有编译,因为您没有将指针转换为const指针,而是将指针转换为一种类型(char*)到另一种类型(const char*)。例如,您可以将char**更改为char* const*,而不是const char**

答案 2 :(得分:2)

检查这是否为您澄清:

char * a_mutable = /*...*/;
const char * a_constant = /*...*/;

char **pointer_to_mutable = &a_mutable;   /* ok */

const char **pointer_to_constant = &a_constant;   /* ok */

pointer_to_constant = pointer_to_mutable;   /* oops, are you sure? */

*pointer_to_constant = a_mutable;   /* valid, but will screw things around */

最后一行是有效的,因为pointer_to_constant是指向常量字符的可变指针的可变指针,但是由于你使a_constant指向a_mutable,它会破坏事物。这就是为什么您不允许pointer_to_constant收到pointer_to_mutable的内容。

答案 3 :(得分:0)

您的第一个示例有效,因为您正在将char* rvalues 转换为const char*,这是正常的(主要是因为您无法分配给rvalues)。第二个没有,因为(非常量)指针的目标始终是左值。

只需尝试(可能借助编译器)您可以使用char**执行哪些操作,这些操作与const char**一起使用,并考虑是否以及哪些类型可以互换。