【问题标题】:C++ pointer of pointers to arrays指向数组的指针的 C++ 指针
【发布时间】:2013-04-19 17:56:15
【问题描述】:

我在创建数组数组时遇到了一点问题,或者更准确地说是指向数组的指针数组,我似乎已经消除了所有错误,因为程序编译得很好(我使用的是 g++)但是当我尝试运行它时,它会给出“核心转储”消息。

这是我的代码?

#include<iostream>
#include<ctime>
#include<cstdlib>

using namespace std;

void create_array(int **pp)
    {
        pp = new int*[4];
        for (int i = 0; i<4; i++)
        {
            pp[i] = new int[4];
        }
    }

int main()
    {
        srand(time(NULL));
        int **pp;
        create_array(pp);

        for (int x = 0; x<4; x++)
        {
            for(int y = 0; y<4; y++)
            {
                pp[x][y] = rand()%9;
            }
        }
        cout << pp[3][2] << endl;
        return 0;
    }

【问题讨论】:

  • 编译所有警告和调试信息g++ -Wall -g,学习使用gdb 调试器,并考虑使用C++ 容器(如std::vector);你的 pp 是一个 unitialized 指针(由 create_array 创建的内存区域当前无法从 main 访问;考虑从 create_array 返回一个指针)

标签: c++ arrays pointers g++ core


【解决方案1】:
 void create_array(int **pp)
{
    pp = new int*[4];
    for (int i = 0; i<4; i++)
    {
        pp[i] = new int[4];
    }
}

pp 是一个指向int 的指针数组,但是它是按值传递的。所以main中的原调用者pp不受影响。调用create_array 函数后,pp 内部的main 仍然是uninitialized。当您尝试为其分配价值时。这将导致核心转储。

尝试在 C++ 中使用 vector &lt;vector&lt;int&gt;&gt;

或者试试:

void create_array(int **&pp)
{                     //^^
    pp = new int*[4];
    for (int i = 0; i<4; i++)
    {
        pp[i] = new int[4];
    }
}

通过上述更改,如果您尝试在我的机器上打印整个矩阵,它会输出以下内容:

 8 7 6 3
 3 5 6 4
 3 8 7 6
 0 0 5 8

【讨论】:

    【解决方案2】:

    如果你不想初始化指针,做一个引用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-25
      • 1970-01-01
      • 2023-03-11
      • 2017-06-11
      • 1970-01-01
      • 1970-01-01
      • 2010-10-25
      相关资源
      最近更新 更多