-4

次のコードがあります。

#include <iostream>

using namespace std;

int main()
{
    int* T = new int;

    T[0] = 1;
    T[1] = 10;
    T[2] = 100;
    T[3] = 1000;
    T[4] = 10000;
    T[5] = 100000;
    T[6] = 1000000;
    T[7] = 10000000;
    T[8] = 100000000;
    T[9] = 1000000000;

    cout << sizeof(T)/sizeof(int) << "<->" << T[3] << endl;

    return 0;
}

結果は私に1を与えますが、これは間違っています。正しい要素数を取得するにはどうすればよいですか?

4

2 に答える 2

4

int* T = new int;1 つの int にスペースを割り当てます。またはintからアクセスできます。T[0]*T

T[1]1 つの整数にしかスペースを割り当てていないため、無効です。

したがって、未定義の動作を実行しました。

int *T = new int[10];ヒープ上に 10int T[10];個の整数用のスペースを割り当てるか、スタック上に 10 個の整数用のスペースを割り当てることができます。

于 2013-10-22T19:23:58.593 に答える
1

として宣言Tしたint *Tので、 が とsizeof(T)/sizeof(int)評価された場合、システム上で anと an の両方が同じバイト数を占める1ことを意味します (もちろん、整数除算のために切り捨てられていないことを前提としています。たとえば、これはまだあなたに与えるでしょう)。int *intsizeof(int*)6sizeof(int)41

変更した場合:

int* T = new int;

に:

int T[10];

期待どおりに機能し、割り当てられていないメモリへの不正な書き込みの問題もすべて修正できます。

に変更するint *T = new int[10];と、メモリ書き込みの問題は修正されますが、はまだ配列ではなく であるため、 にsizeof(T)/sizeof(int)評価さ1れます。Tint *

于 2013-10-22T19:26:06.670 に答える