c++ - 通过引用 C++ 初始化指针数组

标签 c++ arrays pointers reference

基本上我想做的是在一个函数中初始化我的数组,但它会出现段错误:

void func(int **a, int x, int y) {
    a = new int*[x];

    for (int i=0; i<x; i++)
        a[i] = new int[y];
}

void main() {
    int **a;    
    func(a, 2, 3);
}

但是,如果我在函数外部初始化数组然后传递它,一切都完美无缺,我可以为其赋值/打印它们。我正在努力解决的问题是传递我的数组的引用,这样我就不必在函数外初始化它。

void func(int **a, int x, int y) {  
    for (int i=0; i<x; i++)
        a[i] = new int[y];
}

void main() {
    int x = 2;
    int **a = new int*[x];  
    func(a, x, 3);
}

最佳答案

这里困扰您的是 C(和 C++)缺少按引用参数传递。 main() 中的afunc() 中的a 不同:

  1. amain 中声明。
  2. a 按值传递(因为没有其他方式)到 func
  3. func中的a被赋值给。
  4. func 返回。它的 a 被破坏(内存泄漏),maina 未初始化。
  5. ???
  6. main 尝试使用 a段错误!

这里有一些可能的解决方案:

  1. 使用经典的 C 方法:传递指向值的指针。在这种情况下,参数将是 int ***a,这有点荒谬,但无论如何。

    void func(int ***a, int x, int y) {  
        *a = new int*[x];
        for (int i=0; i<x; i++)
            (*a)[i] = new int[y];
    }
    
    int main(int argc, char **argv) {
        ...
        int **a;
        func(&a, 2, 3);
        ...
    }
    
  2. 以 C++ 方式进行:传递引用。

    void func(int **&a, int x, int y) {
        //          ^
        // This is the only change. Neat!
    
  3. 以正确的方式(在我看来):从函数返回一个值,然后从该值初始化数组。

    int **func(int x, int y) {
        int **a = new int*[x]; // EDIT: Fixed stupid typo bug
        // existing code
        return a;
    }
    
    int main(int argc, char **argv) {
        ...
        int **a = func(2, 3);
        ...
    }
    

关于c++ - 通过引用 C++ 初始化指针数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17778059/

相关文章:

c - C 中的指针和循环

C++:如何将数据作为 CSV 输出到现有文件中的一组特定单元格?

c++ - 根据数组检查值时 Arduino 出错

arrays - 将字典中的范围附加到 Swift 中的数组

PHP:以树形结构保存数据

c++ - 如何在 C++ 中将 std::string 传递给 const unsigned char **

c++ - WaitForMultipleObjects 是否会导致创建 STA COM 对象的线程出现问题?

c++ - 通用函数中的模板参数

php - 使用YouTube api v3 playlistItems获取数组中的videoId列表,并构建另一个视频查询以获取统计数据viewCount

c - 找出字符串数组长度和每个字符串长度