Netbeans c / c ++编译器数组从1开始而不是0

时间:2012-05-31 21:08:18

标签: c++ arrays netbeans

这是解释问题的简化代码:

int *nums[10];

*nums[0] = 5;

cout << *nums[0] << endl;

代码已编译,但在执行时失败。所以我尝试了这个:

int *nums[10];

*nums[1] = 5;

cout << *nums[1] << endl;

它打印出来很好。我发现数组是从* nums [1]开始到* nums [10] 而不是通常的* nums [0]到* nums [10]。我已经与其他使用Netbeans C / C ++编译器的人进行了核实,他们的工作应该如此。我假设在特定编译器中改变了一些偏好。如何更改它以使其按预期方式工作?

2 个答案:

答案 0 :(得分:2)

数组基于0 。你正在遇到未定义的行为。

int *nums[10];

创建一个包含10个未初始化指针的数组int

*nums[0] = 5;

取消引用未初始化的指针。任何事情都可能发生。为了使其按预期运行,在访问指针之前分配内存:

for ( int i = 0 ; i < 10 ; i++ )
   nums[i] = new int;

并在结尾删除它:

for ( int i = 0 ; i < 10 ; i++ )
   delete nums[i];

例如,我在MSVS中收到警告:

  

警告C4700:使用了未初始化的本地变量'nums'

还有一次崩溃:)。

答案 1 :(得分:-2)

在C / C ++中,数组始终为0索引。

我假设您要创建一个整数数组。如果你想创建一个指向整数的指针数组,请查看Luchian的答案。

您声明了一个包含10个整数值指针的数组。您没有为实际值分配内存。这就是你得到错误的原因。

您需要为整数分配内存。为此,您有两种方法:

int nums[10];
nums[0] = 5;
cout << nums[0] << endl;

int* nums = new int[10];
nums[0] = 5;
cout << nums[0] << endl;
delete[] nums; // don't forget to delete