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

Netbeans c/c++ compiler array start at 1 instead of 0

本文关键字:开始 c++ 编译器 数组 Netbeans      更新时间:2023-10-16
这是一个

简化的代码来解释这个问题:

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

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

int *nums[10];
*nums[1] = 5;
cout << *nums[1] << endl;

它打印出来很好。我发现数组是从 *nums[1] 到 *nums[10] 开始的而不是通常的 *数字[0] 到 *数字[10]。我已经与使用 Netbeans C/C++ 编译器的其他人进行了检查,他们的编译器可以正常工作。我假设它是特定编译器中更改的一些首选项。如何更改它以使其按应有的方式工作?

数组

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];

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

警告 C4700:使用了未初始化的局部变量"nums"

还有一个崩溃:)。

在 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