2010-08-13 86 views
24

我寫了下面的代碼:警告:分配丟棄了指針目標類型的限定

void buildArrays(char *pLastLetter[],int length[], int size, const char str[]) { 

    int i; 
    int strIndex = 0; 
    int letterCounter = 0; 

    for (i=0; i<size; i++) { 

     while ((str[strIndex] != SEPERATOR) || (str[strIndex] != '\0')) { 
      letterCounter++; 
      strIndex++; 
     } 
     pLastLetter[i] = &str[strIndex-1]; 
     length[i] = letterCounter; 
     letterCounter = 0; 
     strIndex++; 
    } 
} 

和我得到的pLastLetter[i] = &str[strIndex-1];

pLastLetter is a pointers array that points to a char in str[].

任何人都知道上面的警告爲什麼我得到它並如何解決它?

回答

32

那麼,如你所說,pLastLetter是指針陣列char *,而strconst char的數組。 &str[strIndex-1]表達式的類型爲const char*。您不能將const char*值分配給char *指針。這會違反const正確性的規則。事實上,你在做什麼是C中的一個錯誤。C編譯器傳統上稱它僅僅是「警告」,以避免破壞一些舊的遺留代碼。

至於「如何解決這個問題」......這取決於你想要做什麼。要麼pLastLetterconst char*的數組,要麼從str中刪除const

+0

非常感謝您的快速回答,這使我再次遇到了一個問題:如果這是一個函數: void buildArrays(char * pLastLetter [],int length [],int size,const char str []) 可以通過以下方式調用此函數: buildArrays(pLastLetter [],length,str)其中str的類型是char *而不是const char *? 編譯器不會輸出警告,但它可能導致未定義的行爲? 謝謝 – 2010-08-13 18:51:48

+2

@Asher:'const T *'只是一個承諾,不會通過該指針修改指針,所以你可以隱式地將'T *'轉換爲'const T *'精細。 (不過,這對於指針指針來說倒是如此,請參見http://c-faq.com/ansi/constmismatch.html)。 – jamesdlin 2010-08-13 23:13:17

5

str是const,pLastLetter不是。這是說如果你這樣做,const限定符就會被丟棄。

+0

謝謝!我想知道它所說的合格者會被拋棄。 – JohnK 2013-06-18 23:45:06

相關問題