<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Vincent.Chan‘s Blog

    常用鏈接

    統計

    積分與排名

    網站

    最新評論

    為什么 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\n",len);
     
     strcpy(p1,p2);   ///??????????
     
     printf("%s\n",p1);
     
     len=strlen(p1);
     
     printf("%d\n",len);
     return 0;
    }

    我定義的是7個字符數組, 但用strcpy把p2拷到p1中,p1是放不下的,但程序卻正常執行,warning ,err都沒有,運行也正常?


    輸出

    6
    1234567890123213123
    19

    應該是使用內存越界了阿??怎么會正常運行呢?

    難道對于內存越界的使用,運氣好才崩潰表現出來,運氣不好就正常運行??

    posted on 2006-02-22 13:04 Vincent.Chen 閱讀(4081) 評論(0)  編輯  收藏 所屬分類: 雜文

    主站蜘蛛池模板: 亚洲婷婷综合色高清在线| 国产小视频在线免费| 亚洲人成77777在线播放网站| 亚洲丰满熟女一区二区哦| 精品久久久久久久久免费影院| 久久亚洲熟女cc98cm| 一区二区三区福利视频免费观看| 亚洲乱码中文字幕久久孕妇黑人| 国产免费无码一区二区| 91黑丝国产线观看免费| 亚洲伊人久久精品| 希望影院高清免费观看视频| 国产日韩久久免费影院| 免费人成年轻人电影| 一级女人18片毛片免费视频| 亚洲欧洲一区二区三区| 亚洲日本中文字幕区| 免费观看黄色的网站| 精品亚洲视频在线观看| 免费精品久久天干天干| 亚洲熟妇av一区| 男女交性永久免费视频播放| 久久久WWW免费人成精品| 亚洲综合日韩中文字幕v在线| 国产成人免费爽爽爽视频| 极品美女一级毛片免费| 亚洲精品蜜桃久久久久久| 久久www免费人成看片| 亚洲国产无线乱码在线观看| 久久精品亚洲乱码伦伦中文| 999任你躁在线精品免费不卡| 国产精品久久亚洲不卡动漫| 亚洲AⅤ优女AV综合久久久| 国产午夜免费高清久久影院| 亚洲国产成人久久| 亚洲精品国精品久久99热| 99爱免费观看视频在线| 处破女第一次亚洲18分钟| 久久精品亚洲日本佐佐木明希| 黄页网站免费观看| 久久成人18免费网站|