【问题标题】:How to create a dynamic array in C++? It crashes by segmentation fault如何在 C++ 中创建动态数组?它因分段错误而崩溃
【发布时间】:2019-01-27 20:14:26
【问题描述】:

我已经看到这里有一个非常相似的问题:Dynamic array in C cause segmentation fault 它是在 C 上使用 malloc 的,我不明白答案。 我开始学习编程,我刚开始学习数组,恐怕我不太了解它是如何工作的。 我正在尝试创建一个方形动态数组。我正在尝试使用指针和'new'来指向一个var来获取它的大小。 我不明白为什么我的代码(编译时没有警告)不起作用,它在用户输入大小值后崩溃。 这就是我所拥有的:

int main(){

    int **dyn_array=nullptr; //dynamic multidimensional array pointer to pointer

    int *rows_cols=nullptr; //pointer to var with number of rows that wil be introduced by the user 

    int n_elements=0;

    rows_cols = &n_elements;    //now the pointer points to memory location of var with number of rows/cols

    dyn_array = new int *[n_elements];          //pointer of array now points to pointer of rows/cols var to get its size

    cout << "ENTER A EVEN NUMBER OF ELEMENTS FOR A SQUARE ARRAY: " << endl;
    cin >> *rows_cols;  //the value entered by the user its assigned by the pointer to var that its assigned as size of the array

    dyn_array[n_elements][n_elements]={0}; //It crashes. Why? I don't understand...

   return 0;
}

非常感谢。 (对不起,我的英语,我还在学习)。

【问题讨论】:

  • 你创建了一个大小为 0 的数组。

标签: arrays segmentation-fault


【解决方案1】:

代码存在三个问题:

  1. C++ 数组从索引 0 开始,使用 n_elements 索引数组会导致非一访问错误。
dyn_array = new int *[n_elements]; 
dyn_array[n_elements] 
  1. dyn_array 指向一个大小为 0 的 int 数组
int n_elements=0;
dyn_array = new int *[n_elements]; 
  1. 第二个n_elements 索引dyn_array[n_elements] 指向的数组,该数组不存在。
dyn_array[n_elements][n_elements]={0};

修复

int main(){

    int **dyn_array=nullptr; //dynamic multidimensional array pointer to pointer

    int *rows_cols=nullptr; //pointer to var with number of rows that wil be introduced by the user 

    int n_elements=0;

    rows_cols = &n_elements;    //now the pointer points to memory location of var with number of rows/cols

    cout << "ENTER A EVEN NUMBER OF ELEMENTS FOR A SQUARE ARRAY: " << endl;
    cin >> *rows_cols;  //the value entered by the user its assigned by the pointer to var that its assigned as size of the array

    dyn_array = new int *[n_elements];          //pointer of array now points to pointer of rows/cols var to get its size

    for (int i = 0; i < n_elements; ++i) 
       dyn_array[i] = new int [n_elements];

    dyn_array[n_elements-1][n_elements-1]={0}; //It crashes. Why? I don't understand...

   return 0;
}

【讨论】:

  • 谢谢,您的求解代码运行良好。现在我可以让用户决定数组的大小(正方形)。我用一个函数完成了代码来随机加载 dyn 数组。尝试运行它,如果用户引入大于 8 的偶数值,它会运行良好,但如果引入的值是 2、4 或 6,则会因分段错误而崩溃。我不明白为什么......
  • 您可以在segfault.stensal.com 测试您的新代码,以找出可能导致新分段错误的原因。免责声明,这是我公司的工具。
  • 结果(我不明白):@stensal DTS_MSG:DTS 检测到一个致命的程序错误! DTS_MSG:继续执行会导致意外行为,中止! DTS_MSG:OOB 读取:读取 0xa530010 处的 4 个字节将读取未定义的值。 DTS_MSG:诊断信息: - 待读取的对象(开始:0xa530010,大小:1 字节)分配在 -file:/src/new.cpp::54, 17 - 0xa530010 0xa530010 - 待读取的对象read - 从对象开始读取。 - 堆栈跟踪(最近调用优先):-[1] 文件:/prog.cc::36, 29 -[2] 文件:/musl-1.1.10/src/env/__libc_start_main.c::180, 11
  • 你可以使用分享按钮创建一个可分享的链接并将链接发回这里吗?
  • 您的链接中误用了标准输入,我进行了更改。如果这是你想要的,请看看:segfault.stensal.com/a/Ou8gjMbgfkUuwKbJ
【解决方案2】:

您为int 指针的空数组分配了空间。空,因为n_elements 在分配时为零。您还需要通过添加像dyn_array[0] = new int[size]; 这样的行来为dyn_array 的元素分配空间。

但是,最好尝试std::vector&lt;int&gt;,而不是搞乱动态内存分配。

【讨论】:

    猜你喜欢
    • 2014-04-26
    • 2017-09-28
    • 1970-01-01
    • 2012-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-20
    相关资源
    最近更新 更多