我發現嵌入在C++項目中的以下代碼片段。代碼通過C風格的字符串倒退。當我看到這個時,我認爲這應該導致未定義的行爲。但它似乎很好地工作:爲什麼我在字符串開始處遇到NULL終止字符?
const char * hello = "Hello World.";
const char * helloPointPos = strchr(hello, '.');
for (const char * curchar = helloPointPos; *curchar; curchar--) {
printf("%s", curchar);
}
我想知道的是*curchar; curchar--
的一部分。這假定字符串以\ 0開頭。這是一個合法的假設嗎?這段代碼是否會導致未定義的行爲?如果不是,爲什麼不呢?
如果您能夠對此進行說明,我將不勝感激。 BTW平臺是Windows,編譯器是VC++ 2010.
編輯:謝謝大家的參與。這兩個答案都非常好,幫助了我。但既然我只能接受一個答案,我會去找paxdiablo的答案,因爲它有更多的細節。謝謝!
您可以看到下一段代碼中環路條件將失敗的情況示例: \t char * a =「BYE」; \t char * c =「HELLO」; \t *(a + 3)='L'; \t \t 的printf( 「>%d \噸%d \ n」,*( - C), '\ 0'); – 2013-05-08 06:39:38
@PabloFranciscoPérezHidalgo,修改'*(a + 3)'在這種情況下,本身是未定義的行爲('「BYE」是一個常量)。無論如何,我從來沒有說過在一個常量字符串之前保證有'\ 0'。 – ugoren 2013-05-08 13:23:53