Code :: Blocks,Win7,C ++
嗨,我正在为自己创建一个概述项目,其中不可或缺的部分包括按降序进行Exchange排序。我创建了一个简单的试运行来测试这个概念。
令人尴尬的是,在没有项目崩溃的情况下,我无法通过创建阵列。这只发生在我用指针创建数组时(我的项目的数组是指针,这就是我需要这个工作的原因)。代码编译得很好,但是当我运行它时,我得到一个Window的通知“ArrayTest.exe已经停止工作”
当我打印出每个解除引用的值时,我得到:
“原始订单:1 13 5 7 2”
当我打印出每个值的地址时,我得到:
“原始顺序:0x28ff08 0x28ffc4 0x760c8cd5 0x6aadab61 0xfffffffe”
当使用数组长度为6时,最后一个地址出现了,并且崩溃了。我是否对代码中的简单错误视而不见,或者这是硬件问题?
//filename ArrayTest
#include <iostream>
using namespace std;
int main()
{
int *j[5];
(*j)[0] = 1;
(*j)[1] = 13;
(*j)[2] = 5;
(*j)[3] = 7;
(*j)[4] = 2;
cout << "The original order: ";
for (int i = 0; i < 5; i++)
{
cout << (*j)[i] << " ";
}
return 0;
}
答案 0 :(得分:1)
仔细考虑int *j[5];
。这是一个指针的数组。
这些指针并未指向您拥有的内存。
因此取消引用它们的行为是未定义的。
简单修复:改为使用int j[5];
和j[0] = 1
等。
在分析代码问题时,请将这些数字视为近似错误位置的概率:
99.0% - 您的代码
0.9% - 标准库
0.09% - 编译器
0.009% - 操作系统
0.001% - 硬件
答案 1 :(得分:1)
如果要在数组上使用指针,则必须使用此语法
int array[5];
int (*j)[5] = &array;
(*j)[0] = 42;
答案 2 :(得分:1)
所以,首先,正确的语法是int j[5];
,但那是C,而不是C ++。
使用std::array
- 实际的C ++和编译时检查。
答案 3 :(得分:0)
您正在为int分配一个包含5个指针的数组,而不是5个整数的数组。尝试按如下方式初始化数组:int j[5];
您的代码将值1,1,3,5,7,2写入指针数组中的解除引用指针。因为它们是未初始化的,所以它们包含垃圾,因此你在内存中写入随机地址,这会导致崩溃。