2017-07-14 91 views
0

爲什麼argc的輸出有差異?爲什麼argc的輸出有差異?

第一:

#include<stdlib.h> 
#include<stdio.h> 
#include<iostream> 
int main(int argc,char *argv[]) 
{ 
    for(int i=1;i<=argc;i++) 
    std::cout<<argv[i]<<"\n"<<std::endl; 
    std::cout<<argc<<std::endl; 
    return 0; 
} 

我得到的輸出的argv但是我不爲她的argc獲取輸出。

第二種情況:

#include<stdlib.h> 
#include<stdio.h> 
#include<iostream> 
int main(int argc,char *argv[]) 
{ 
    std::cout<<argc<<std::endl; 
    for(int i=1;i<=argc;i++) 
    std::cout<<argv[i]<<"\n"<<std::endl; 
    return 0; 
} 

我得到兩個的argv和argc個輸出。

在這兩種情況下,如果我使用「printf」而不是「cout」,我會得到argc的輸出。

爲什麼argc的輸出有差異?

+3

'我<= argc'導致未定義的行爲。如果'argc'是2,那麼有效的'argv'索引是'argv [0]'和'argv [1]'。 'argv [2]'是未定義的行爲。 – jww

+0

剛剛發生'std :: cout'機制混淆,因爲你在代碼中訪問'argv [argc]'。如果你在'std :: cout << argc << std :: endl;'之前運行'fprintf(stdout,「%d \ n」,argc);',或許你可以得到'argc'的值它發生在我身上)。無論如何:總是像其他人告訴你的那樣, tzot

回答

2

它由C++規範和POSIX指定argv[argc]將始終爲空指針。當您在循環條件中使用<=時,您試圖取消引用空指針。

當您取消引用空指針時,您將有undefined behavior (or UB)。它通常導致崩潰printf函數通常會檢查空指針字符串並打印"(null)",但它仍然是UB。

+0

在第一種情況下,我在「for循環」之外使用了「cout for argc」。循環沒有{},所以只考慮下面的一條語句。它適用於「printf」 – varun

+0

@varun更新了我的答案。 –

3

您的代碼在這兩種情況下的行爲是undefined。您需要將i<=argc替換爲i < argc

由C++標準argv[argc]nullptr不要嘗試解除引用。