0

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

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++ 编译器的其他人,他们的工作正常。我认为这是特定编译器中的某些偏好更改。如何更改它以使其按应有的方式工作?

4

2 回答 2

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”

还有一个崩溃:)。

于 2012-05-31T21:13:01.970 回答
-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
于 2012-05-31T21:13:58.377 回答