• 为什么 char** 不能自动转化为 const char**


    一次偶然的情况下我发现以下代码竟然无法被编译通过(如果你的编译器,比如VC6或VC2003,允许它编译通过,我想你首先应该换个编译器,比如GCC或VC2005):
    void foo( const char* [] ) { }
    int main( void )
    {
        char* s[2];
        foo( s );
    }

    简化成更一般的形式是:
    char** p1 = 0;
    const char** p2 = p1;

    错误是:invalid conversion from `char**' to `const char**'.

    lostpencil更加仔细,使用C编译器给出的是一个警告:
    initialization from incompatible pointer type.

    随后hpho给出了合理的解释,同时comp.lang.c++.moderated上的Ulrich Eckhardt也用代码进行了说明。

    用代码来说明最直观了:
    const char* s = "abc";
    int main( void )
    {
        char* p0 = 0;
        char** p1 = &p0;
        const char** p2 = p1;
     // 先假设这一句是合法的 ( 测试时,可以先强制类型转化一下 )
        *p2 = s;
        *p0 = 'A';
     // 通过p0在修改不应该被修改的s,这显然和const相违背,其运行结果不可知。
    }




    看了 **的 想到的
    tekyDec 29, 2005 -  Show original item

    看完后.明白**讲的为什么char** 不能自动转化为 const char**,(原文)但对我影响最深的是下面的话:

    ==================================================================
    char *p="abc" 能不能编译通过要看你使用的编译器。鉴于大量遗留代码的存在,大部分编译器允许其通过,或者给个警告。当然,程序员自己必须保证绝不去修改其值。

    程序员不应该在代码中出现*p='A'这样的语句。这是当初约定好了的:编译器允许char *p="abc"通过,而程序员保证不去修改它。 
    b. *p='A'编译时应该允许通过,因为单就这条语句而言,它完全合法。 
    c. 运行时*p='A'能不能通过要看实际的运行环境,包括你使用的操作系统、编译器、编译器选项 等等,一句话,其运行结果由不得你,且不应该由你去关心,因为这种行为本身已经违反约定了。 
    ==================================================================

    工作关系吧,用CString 和string用的太多了,很少这样定义字符串 char *p=“abcde“了
    匝一看,还不适应,:(,渐渐的回想才想起一些来(哎,还是太生疏,赶快写下来,以后别忘了)

    这样定义的字符串char *p=“abcde“ ; char *p1=“123445667“;

    正如上面提到的是不能再 *p='A',运行的时候会出错,同样,strcpy(p,p1)也会出错哟,

    "abcde"字符串可以看做是个常量字符串了,是不能被修改的,

    但如果 char p[]=“abcde“ 这样定义,就没有问题,你可以修改*p='A',只要不越界就ok.

    并且发现这样两种定义
    char *p=“abcde“

    char p[]=“abcde“

    在运行的时候,p指向的地址也不是一样的,可见char *p=“abcde“还是有特殊的处理 :),具体怎么处理就不知道了,高手请指教:)


    随着测试,又发现个问题,可能是个老问题了吧:


    int main(int argc, char* argv[])

     int t[10];
     char p1[7]="123456";
     const char *p2="1234567890123213123";
     
     int len(0);
     
      //*p1='C';  err

     len=strlen(p1);
     printf("%d ",len);
     
     strcpy(p1,p2);   ///??????????
     
     printf("%s ",p1);
     
     len=strlen(p1);
     
     printf("%d ",len);
     return 0;
    }

    我定义的是7个字符数组, 但用strcpy把p2拷到p1中,p1是放不下的,但程序却正常执行,warning ,err都没有,运行也正常?


    输出

    6
    1234567890123213123
    19

    应该是使用内存越界了阿??怎么会正常运行呢?

    难道对于内存越界的使用,运气好才崩溃表现出来,运气不好就正常运行??

  • 相关阅读:
    制作SD(8G)卡Linux镜像,使得ZC706开发板可以从SD卡启动进入Linux系统
    微信小程序学习
    linux 驱动 printk 输出变量格式
    linux驱动- PCI-E设备驱动-PCIE设备结构体
    ubuntu 14.04 root登录
    Linux 应用程序 网络通讯函数记录
    linux 驱动学习 GPIO驱动相关函数详解
    linux 驱动学习 内核头文件 interrupt.h
    linux 驱动学习 常用头文件 cdev.h
    2020.11.10 1课 c++1 内联函数inline,引用对变量取别名,函数重载,缺省
  • 原文地址:https://www.cnblogs.com/snowxshy/p/4080396.html
Copyright © 2020-2023  润新知