【问题标题】:Segmentation Fault when populating an array [closed]填充数组时出现分段错误[关闭]
【发布时间】:2017-12-29 19:41:17
【问题描述】:

这可能是很容易解决的问题。我不知道我做错了什么,请帮助这个超级简单的代码。

#include <iostream>

using namespace std;

int main()
{
    int arraysize, i, a[arraysize], n, j;

    cout << "array size";
        cin >> arraysize;

    for(int i=0, j = arraysize; i < arraysize, j > 0; i++, j--){
        a[i] = j;
        cout << "a[" << i << "] = " << a[i] << endl;
    }
}

当执行这个程序时,它会输出数组的 5 个值,然后我得到一个分段错误。我不知道如何解决此问题和\或如何正确执行此类问题。任何帮助表示赞赏,谢谢。

【问题讨论】:

  • arraysize 在您声明数组 a[arraysize] 时保存垃圾值。
  • Could not 使用 GCC 复制。不要使用 VLA 并在使用变量之前对其进行初始化。
  • 正如@AditiRawat 所说,arraysize 将垃圾存放在第一次使用的地方。此外,int a[arraysize] 不是有效的 C++,即使在 arraysize 中有有效值。一些编译器允许将其作为扩展,但至少应该给你一个警告,表明你所做的不是 kosher。

标签: c++ arrays segmentation-fault


【解决方案1】:

arraysize 在构造a 时没有指定值,这意味着您在指定a 的大小时调用了未定义的行为。

这段代码的未定义行为版本是这样的:

#include <iostream>

//Don't use "using namespace std;"!
//using namespace std;

int main()
{
    //removed unused/unnecessary variables
    int arraysize;

    std::cout << "array size";
        std::cin >> arraysize;

    int a[arraysize];

    for(int i = 0; i < arraysize; i++) {
        int j = arraysize - i;
        a[i] = j;
        std::cout << "a[" << i << "] = " << a[i] << std::endl;
    }
}

但是。像这样在运行时指定数组大小是语言的非标准扩展,并且可能不适用于所有环境。如果您希望此代码符合标准,则需要使用std::vector

#include <iostream>
#include <vector>

int main()
{
    int arraysize;

    std::cout << "array size";
        std::cin >> arraysize;

    std::vector<int> a(arraysize);

    for(int i = 0; i < arraysize; i++) {
        int j = arraysize - i;
        a[i] = j;
        std::cout << "a[" << i << "] = " << a[i] << std::endl;
    }
}

我已从您的代码 for these reasons 中删除了对 using namespace std; 的使用。

【讨论】:

  • 老实说帮了很多忙,非常感谢。
【解决方案2】:

这显然是未定义的行为。
首先,C++ 标准不支持变长数组。 这是一些编译器(如 gcc)的扩展。

其次,当您实例化一个数组时,arraysize 的值是未定义的,因此结果是不可预测的,它在某些情况下可能会起作用,但这完全取决于运气。

如果您需要动态大小的数组,最好使用std::vector

#include <iostream>

using namespace std;

int main()
{
    int arraysize, i, n, j;
    std::vector<int> a;

    cout << "array size";
    cin >> arraysize;

    std::vector<int> a(arraysize);

    for(int i=0, j = arraysize; i < arraysize, j > 0; i++, j--){
        a[i] = j;
        cout << "a[" << i << "] = " << a[i] << endl;
    }

    return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多