崩溃的指针数组C ++

时间:2016-01-05 08:32:08

标签: c++ arrays pointers

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

4 个答案:

答案 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写入指针数组中的解除引用指针。因为它们是未初始化的,所以它们包含垃圾,因此你在内存中写入随机地址,这会导致崩溃。