2

私はC++を学んでおり、プリプロセッサをカバーしていますが、クイズからの質問を解決しようとしていますが、それは私を少しまたは多く混乱させました..プログラムを実行する前に自分で解決しようとしました..そして私の出力だった..

システムが起動しました...
2 のデータ: 27 28 29 30
1 のデータ: 23 24 25 26
データ: 19

Xcode でプログラムをチェックして、出力が正しいかどうかを確認しましたが、正しい出力は次の出力です。

システムが起動しました...
1 のデータ: 0 0 0 19 0 のデータ
: 7 0 0 0
データ: 19 0 0 0

これはコードです...

#include <iostream>

namespace test{
#define COMPILE_FAST
#define PRINT_SPLIT(v) std::cout << (int)*((char*)(v)) << ' ' << \
(int)*((char*)(v) + 1) << ' ' << (int)*((char*)(v) +2) << ' ' << \
(int)*((char*)(v) + 3) << std::endl

    typedef unsigned long long uint;
    namespace er{
        typedef unsigned int uint;
    }
    void debug(void* data, int size = 0){
        if(size==0){
            std::cout << "The data is: ";
            PRINT_SPLIT(data);
        } else {
             while(size--){
                std::cout << "Data at " << size << " is: ";
                char* a = (char*)data;
                PRINT_SPLIT((a + (4+size)));
            }
        }
    }
}// End of Test namespace...

int main(){
    test::uint a = 19;
    test::er::uint b[] = {256,7};
    std::cout << "System started..." << std::endl;
    test::debug(b,2);
    test::debug(&a);
    std::cout << "Test complete";
    return 0;
}

私の大きな疑問、または実際に理解していないのは、このプリプロセッサで何が起こっているのかということです。なぜなら、明らかに私がしたことは完全に間違っているからです...

#define PRINT_SPLIT(v) std::cout << (int)*((char*)(v)) << ' ' << \
(int)*((char*)(v) + 1) << ' ' << (int)*((char*)(v) +2) << ' ' << \
(int)*((char*)(v) + 3) << std::endl

誰かがとても親切で簡単な説明をしてくれたら、とても感謝します。

4

1 に答える 1

1

マクロは、連続する 4 バイトの値を (int として) 出力します。4 バイトの int がメモリにどのように配置されているかを確認できます。

メモリの内容は、バイトごとに次のようになります (base10):

0x22abf0:       0       1       0       0       7       0       0       0
0x22abf8:       19      0       0       0       0       0       0       0
  • 0 1 0 0 は 256、つまり b[0]
  • 7 0 0 0 は 7、つまり b[1]
  • 19 0 0 0 0 0 0 0 は 19 です。

には 2 つの異なる typedef があるため、sizeof(a)は とは異なります。すなわち、と.sizeof(b[0])uinttest:uinttest::er::uint

スタックがメモリ内で下向きに成長しているため、後で b が宣言されていても、 のアドレスは のアドレスaよりも大きくなっています。b[]a

最後に、出力はより合理的に次のようになるため、出力は欠陥のあるプログラムを表していると言えます。

System started...
Data at 1 is: 7 0 0 0
Data at 0 is: 0 1 0 0
The data is: 19 0 0 0

その出力を取得するには、プログラムを次のように変更する必要があります。

         while(size--){
            std::cout << "Data at " << size << " is: ";
            int* a = (int*)data;
            PRINT_SPLIT((a + (size)));
于 2013-10-28T23:34:22.320 に答える