将两个指针数组合并为 C++ 中的第三个指针数组

Merge two arrays of pointers into a third array of pointers in C++

arr1,arr2 是两个指针数组,我必须将它们合并到arr3 中。 当程序获取 arr3[1](当 k=1 时)程序关闭,我不明白为什么。

请帮忙。

class Node {
public:
    Node* left;
    T data;
    Node* right;
    int height;
};
    void mergeArrays(Node<T>** arr1,Node<T>** arr2,int len1,int len2){
        int p=0,q=0,k=0;
        Node<T>** arr3 = new Node<T>*[len1+len2];
        
        while ( p < len1 && q < len2) {
                if ((arr1[p])->data< (arr2[q])->data) {
                    (arr3[k++])->data = (arr1[p++])->data;
    
                } else {
                    
                    (arr3[k++])->data = (arr2[q++])->data;    
                }  
            
            }
       
            while ( p < len1) {
                (arr3[k++])->data = (arr1[p++])->data;
            }
            while ( q < len2) {
         
                (arr3[k++])->data = (arr2[q++])->data; 
            }
    
            
            
    }

你不是在复制指针。您正在将某个对象的一个​​ data 成员的值复制到某个对象的另一个 data 成员。但问题是,那里没有“那里”可以复制 to 。您为 arr3 分配了一个指针床,但这些指针后面没有对象,因此:

(arr3[k++])->data = (arr1[p++])->data;

调用未定义的行为。

我很确定这就是您的目标:

template<class T>
Node<T>** mergeArrays(Node<T> **arr1, Node<T> **arr2, int len1, int len2)
{
    int p = 0, q = 0, k = 0;
    Node<T> **arr3 = new Node<T> *[len1 + len2];

    while (p < len1 && q < len2)
    {
        if ((arr1[p])->data < (arr2[q])->data)
        {
            arr3[k++] = arr1[p++];
        }
        else
        {
            arr3[k++] = arr2[q++];
        }
    }

    while (p < len1)
    {
        arr3[k++] = arr1[p++];
    }
    while (q < len2)
    {
        arr3[k++] = arr2[q++];
    }

    return arr3;
}