2017-07-14 10 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; 
} 

しかし私は、私はargcのための出力を得ることはありませんargvのための出力を取得します。

第二の場合:

#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の両方の出力を取得します。

どちらの場合も、 "cout"ではなく "printf"を使用すると、argcの出力が得られます。

なぜargcの出力に違いがありますか?

+3

'i <= argc'は未定義の動作につながります。 'argc'が2の場合、有効な' argv'インデックスは 'argv [0]'と 'argv [1]'です。 'argv [2]'は未定義の動作です。 – jww

+0

あなたのコードで 'argv [argc]'にアクセスしているので、 'std :: cout'メカニズムが混乱するだけです。 'std :: cout << argc << std :: endl;'の前に 'fprintf(stdout、"%d \ n "、argc);を実行すると、おそらく' argc'の値を得ることができますそれは私のために起こる)。いずれにせよ、常に他の人があなたに言ったように、常に ' tzot

答えて

2

argv[argc]は常にNULLポインタになるというC++仕様とPOSIXの両方によって規定されています。ループ状態で<=を使用すると、そのヌルポインターを逆参照しようとします。

nullポインタを逆参照すると、undefined behavior (or UB)になります。通常、のクラッシュにつながります。 printf関数は通常nullポインタ文字列をチェックして"(null)"を出力しますが、まだUBです。

+0

最初のケースでは、 "for loop"の外側に "cout for argc"を使用しています。ループは{}を除いているので、その下の1つの文が考慮されます。それは "printf"のために完全に動作します – varun

+0

@varun私の答えを更新しました。 –

3

両方の場合のコードの動作は、は定義されていません。です。 i<=argci < argcに置き換える必要があります。

C++標準ではargv[argc]nullptrです。 を参照しないでください。

関連する問題