-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;为一个 int 分配空间。您可以int通过T[0]或访问它*T

T[1]无效,因为您只为一个整数分配了空间。

因此,您执行了未定义的行为。

你可以这样做int *T = new int[10];,它会在堆上为 10 个整数int T[10];分配空间,或者在堆栈上为 10 个整数分配空间。

于 2013-10-22T19:23:58.593 回答
1

您声明Tint *T,因此如果sizeof(T)/sizeof(int)计算结果为1,则意味着 anint *和 anint在您的系统上占用相同数量的字节(当然,假设您没有因整数除法而截断 - 如果您有一个奇怪的系统sizeof(int*)where6sizeof(int)4,例如,这仍然会给你1)。

如果你改变了:

int* T = new int;

至:

int T[10];

它会按照您的预期工作,并且您还可以解决所有非法写入未分配内存的问题。

更改为int *T = new int[10];将解决您的内存写入问题,但sizeof(T)/sizeof(int)仍会1为您评估,因为T仍然是int *,而不是数组。

于 2013-10-22T19:26:06.670 回答