2

Dev-C ++を使用すべきではないことはわかっていますが、学校では必須であるため、何もできません。

トピックはC/C ++のポインターであり、整数配列の長さの測定中にバグが発生しました。以下のコードを参照してください。

// POINTER
# include<iostream>
# include<string.h>

using namespace std;

int main(){
    //neues Feld anlegen
    int *a = new int[5];

    a[0] = 12;
    a[1] = 5;
    a[2] = 43;
    a[3] = -12;
    a[4] = 100;
    // Feld füllen

    for(int i = 0; i<sizeof(a);i++){
            cout<<a[i]<<"\n"<<endl;
            }
    cout<<sizeof(a);
    system("pause");
    return 0;

}

sizeof()は5ではなく4を返します...何かアイデアはありますか?

4

9 に答える 9

26

配列の長さではなく、aそれ自体のサイズ (32 ビット ビルドでは 4 バイト) を返すため、これはバグではありません。int*

注意してください-サイズはオペレーティングシステムに依存するという人もいますが、これは半分真実です。それは本当にビルドに依存します。sizeofコンパイル時の構造です。

于 2011-11-14T13:59:10.543 に答える
5

まず第一に、「奇妙な」振る舞いの原因がコンパイラであると考えるべきではありません。ほとんどの場合、バグはあなたのものです。

実際、あなたのsizeof命令は、のサイズを教えてくれますがint*、それは仕様によるものなので、コンパイラのせいではなく、あなたの誤解です。sizeof動的に割り当てられた配列のサイズを知るために使用する方法はありません。

于 2011-11-14T14:02:13.733 に答える
2

この場合の a はポインタであり、ポインタのサイズはコンパイラに依存します。

sizeof(int*) を実行しています。実際、あなたは 32 ビット コンパイラを使用しており、コンパイラ\システムのポインタは 32 ビットです。

new で割り当てられたオブジェクトのサイズをポインタから取得することはできません。sizeof は実行時ではなくコンパイル時に評価されます。

配列のサイズを取得するには...

int a[5]; // Array allocated in stack, we can use sizeof.
std::cout << (sizeof(a) / sizeof(int));

sizeof は、配列の要素数ではなくサイズをバイト単位で返します。

そのコードは書き込みと同等です

std::cout << (sizeof(int[5]) / sizeof(int));
于 2011-11-14T14:02:23.720 に答える
1

sizeofは配列サイズを教えてくれません。これは、データ型のサイズ(この場合はint *)を示します。これは、プラットフォームでは4バイトです。配列要素の数に関係なく、常に4になります。

于 2011-11-14T14:00:20.000 に答える
1

ローカル変数aはポインタ型(int*)です。32ビットオペレーティングシステムでは、ポインタサイズは4バイトです。

于 2011-11-14T14:01:13.690 に答える
1
int* a;
cout<<sizeof(a);

と同等です:

cout<<sizeof(int*);

プラットフォームに応じて、これは可変です。ほとんどのx32プラットフォームでは、4バイトになり、x64プラットフォームでは8バイトになります。

于 2011-11-14T14:01:23.143 に答える
1

また、あなたがここで持っている誤解は、

int a* = new int[5];

型の配列へのポインタとして a を宣言していることを意味しますint。これは事実ではありません。

int a* へのポインタを宣言していることを意味しますint

new int[5]は、5 つの型にメモリ空間を割り当てていることを意味しますint

int a* = new int[5];は、5 つの int を格納するためのメモリを割り当て、int ポイント a を最初の要素を指すように設定していることを意味します。

配列を宣言した場合:

int a[5];  // an array of 5 ints

次に、次のことができます。

for (int i=0; i< (sizeof(a)/sizeof(a[0])); i++)
{
  cout<<a[i]<<"\n"<<end1;
}  

cout<< sizeof(a)/sizeof(a[0]);
于 2011-11-14T14:24:06.053 に答える
0

あなたが望むことをするためのより簡単な方法:

    #define NumberOfInts 5

    int* a = new int[NumberOFInts];

    for(int i = 0; i<NumberOfInts; i++){ 
    ....
    }    

これが一般的に「良いスタイル」と見なされるかどうかはわかりませんが、コードは修正されます。

于 2011-11-14T14:16:09.207 に答える