C ++分段故障数组

时间:2015-05-06 23:06:05

标签: c++

在C ++中,我告诉程序数组应该有多大(x)后会出现分段错误。

为什么会发生这种情况?如何解决这个问题?

#include <iostream>
using namespace std;

int main()
{
    int x;
    cin >> x;
    int array[x];

    for (int *j=array; j; j++)
    {
        *j=0;
    }

    for (int *i=array; i; i++)
    {
        cin >> *i;
    }

    cout << array[3] << endl;
}

4 个答案:

答案 0 :(得分:2)

您的循环条件错误。

for (int *j = array; j; j++)

for (int *i=array; i; i++)

不会在数组末尾停止,因为条件ji)在遍历数组时为真(即,为假,指针需要为{{1} })。事实上,pointer arithmetic past the array boundary plus one results in undefined behaviour。你的停止条件应该是

nullptr

此外,可变长度数组是扩展,不受C ++标准的支持。正如@Joshua Byer指出的那样,使用i < array + x; 来分配内存。

答案 1 :(得分:0)

int * array;
array= new int [x];

http://www.cplusplus.com/doc/tutorial/dynamic/

答案 2 :(得分:0)

for语句中,第二个表达式应该通过评估false来终止循环。在这种情况下,你永远不会终止循环:

for (int *j=array; j; j++)

取而代之的是:

for (int *j=array; j < array + x; j++)

表达式array + x(通过指针运算)表示超出数组末尾的一个元素。

以上两种循环都适用。

答案 3 :(得分:0)

循环中使用的条件不正确。

例如。 [data][request][json]即使for (int *j = array; j; j++)最终会到达数组的末尾,但仍然永远不会评估为false(允许循环完成)。除此之外,它意味着您将迭代到数组末尾并进入未定义行为,这可能是您看到段错误的原因。

您需要执行以下操作(超级大解决方案!!!!也不支持C ++标准):

j

将递增计数器并在增加指针的同时检查数组。

使用矢量

std::vector是一种更轻松的方式来做你正在做的事情。

for (int i = 0, *j = array; i < x; i++, j++)

这是live example.