我有以下代码:
#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不正确。如何获得正确数量的元素?
答案 0 :(得分:4)
int* T = new int;
为一个int分配空间。您可以通过int
或T[0]
。
*T
T[1]
无效,因为您只为一个整数分配了空间。
因此,您已经行使了未定义的行为。
您可以执行int *T = new int[10];
,它将为堆上的10个整数分配空间,或int T[10];
,它将为堆栈上的10个整数分配空间。
答案 1 :(得分:1)
您将T
声明为int *T
,因此如果sizeof(T)/sizeof(int)
评估为1
,则表示int *
和int
都会占用你系统上的字节数相同(假设你没有因为整数除法而截断,当然 - 如果你有一个奇怪的系统sizeof(int*)
是6
,而sizeof(int)
是{例如,{1}}这仍然会给你4
)。
如果你改变了:
1
为:
int* T = new int;
它会像您期望的那样工作,并且您还可以解决所有非法写入未分配内存的问题。
更改为int T[10];
会解决您的内存写入问题,但int *T = new int[10];
仍会为您评估sizeof(T)/sizeof(int)
,因为1
仍为T
,不是阵列。