簡體   English   中英

* argv ++和* argv之間的差異-達到限制時

[英]Difference between *argv++ and *argv— when reaching the limit

有人可以解釋為什么

int main(int argc, const char * argv[]) {
  while (* argv) 
    puts(* argv++);
  return 0 ;
}

是合法的,並且

int main(int argc, const char * argv[]) {
  argv += argc - 1;
  while (* argv) 
    puts(* argv--);
  return 0 ;
}

是不是? 在這兩種情況下,while循環內的增量都將指向argv的邊界之外。 為什么指向虛構的較高索引而不指向虛構的較低索引是合法的?

最好的祝福。

因為C標准說您可以形成一個指向數組末尾的指針,並且它仍然可以與數組中的指針進行正確比較(盡管您不能取消引用它)。

該標准沒有對數組開頭之前指向地址的指針進行任何說明,即使形成這樣的指針也會產生不確定的行為。

循環語義和半開間隔。 遍歷指針所指向的對象的數組或列表的慣用方式是:

for (T *p = array; p < array + count; p++)

在這里, p最終越界(偏離一,指向數組末尾一個),因此(不僅僅在概念上)要求不調用未定義的行為是有用的(標准實際上強加了此要求) 。

該標准強制argv[argc]等於NULL ,因此在增加argc次數后取消引用argv是合法的。

在另一方面沒有被定義約前的地址argv ,所以argv - 1可以是任何東西。

請注意,據我所知,argv是唯一保證以這種方式運行的字符串數組。

從標准:

5.1.2.2.1程序啟動

如果聲明了它們,則主函數的參數應遵循以下要求:

argv [argc]應為空指針

argv++++argv是常量指針。

如果采用像char* arr[10]這樣的簡單數組並嘗試使用arr++ ,它將給出錯誤信息

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM