这是解释问题的简化代码:
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 ++编译器的人进行了核实,他们的工作应该如此。我假设在特定编译器中改变了一些偏好。如何更改它以使其按预期方式工作?
答案 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