Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ leetcode 88。合并排序数组c++;运行时错误_C++_Mergesort - Fatal编程技术网

C++ leetcode 88。合并排序数组c++;运行时错误

C++ leetcode 88。合并排序数组c++;运行时错误,c++,mergesort,C++,Mergesort,我正在做leetcode问题88。以下是链接: 给定两个已排序整数数组nums1和nums2,将nums2作为一个已排序数组合并到nums1中。nums1和nums2中初始化的元素数分别为m和n。您可以假设nums1有足够的空间(大小大于或等于m+n)来容纳nums2中的其他元素 我用C++解决了这个问题。但我总是遇到这样的运行时错误: Runtime Error Message: Line 922: Char 34: runtime error: reference binding to nu

我正在做leetcode问题88。以下是链接:

给定两个已排序整数数组nums1和nums2,将nums2作为一个已排序数组合并到nums1中。nums1和nums2中初始化的元素数分别为m和n。您可以假设nums1有足够的空间(大小大于或等于m+n)来容纳nums2中的其他元素

我用C++解决了这个问题。但我总是遇到这样的运行时错误:

Runtime Error Message:
Line 922: Char 34: runtime error: reference binding to null pointer of type 'value_type' (stl_vector.h)
Last executed input:
[1]
1
[]
0
这是我的密码:

class Solution {
public:
    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
        int output[m+n] = {0};
        int i = 0;
        int j = 0;
        if(sizeof(nums1) == 0)
        {
            for(i = 0; i < n; i++)
            {
                nums1[i] = nums2[i];
            }
            return;
        }
        if(sizeof(nums2) == 0)
        {
            return;
        }
        for(int k = 0; k < m+n; k++)
        {
            if(nums1[i] <= nums2[j])
            {
                if(i < m)
                {
                    output[k] = nums1[i];
                    i++; 
                }
                else if(j < n)
                {
                    output[k] = nums2[j];
                    j++;
                }
            }
            else if(nums1[i] >= nums2[j])
            {
                if(j < n)
                {
                    output[k] = nums2[j];
                    j++;
                }
                else if(i < m)
                {
                    output[k] = nums1[i];
                    i++;
                }
            }
        }
        for(i = 0; i < m+n; i++)
        {
            nums1[i] = output[i];
        }
    }
};
类解决方案{
公众:
无效合并(向量和nums1,int m,向量和nums2,int n){
int输出[m+n]={0};
int i=0;
int j=0;
if(sizeof(nums1)==0)
{
对于(i=0;i

它很容易测试,只需点击上面的链接,复制我的代码,然后提交。我希望有人能帮助我

使用
std::vector
时,要检查它是否为空,应使用成员函数
size()
sizeof
不是正确的检查

  if(sizeof(nums1) == 0)
应该是

nums1.size()==0
nums2向量也是如此。另一件需要注意的事情是
输出
数组大小在编译时是未知的,通常不支持VLA,在这里也使用vector

std::vector<int> output(m+n,0); //Initialized with m+n elements with value 0
std::向量输出(m+n,0)//使用值为0的m+n元素初始化

您当前的方法存在一些缺陷,例如:

  • sizeof(nums1)
    运算符只在以下情况下给您提供
    0
    :nums1[],m=0,nums2[],n=0
    ,因为对于所有其他情况,当
    m=0
    n=0
    nums1
    将包含
    0
    ,并且它不会是空列表。例如
    nums1[0,0],m=0,nums2[1,2],n=2
    。要处理此问题,请检查
    m==0
    n==0
    而不是使用
    sizeof

  • 行中,如果(nums1[i]=n
    ,它将抛出分段错误

  • 如果检查LeetCode上的所有测试用例,您可能会发现更多的缺陷

下面给出了一个正确的方法。这个解决方案在LeetCode上是可以接受的。我添加了一些注释,这些注释大多是不言自明的。如果您有任何疑问,请随时发表评论

类解决方案{
公众:
无效合并(向量和nums1,int m,向量和nums2,int n){
int输出[m+n]={0};
int i=0;
int j=0;
int k=0;
如果(m==0)//nums1为空。例如nums1[0,0],m=0和nums2[1,2],n=2
{
对于(i=0;i=m | | j>=n)//检查是否已用尽nums1或nums2列表中的任何一个
打破

如果(nums1[i]
sizeof(nums1)==0
永远都不是真的。
sizeof(nums2)==0
请注意,您不需要额外的p数组。问题是建议不要这样做(num1足够大)。首先尝试在末尾填充num1。在使用
num1[i]
num2[j]之前,您必须先测试
i
j
的有效性
.UBI修改了我的代码,它有了一点改进。但它遇到了另一个问题。
运行时错误消息:AddressSanitarizer:在pc 0x00000040756f bp 0x7ffe441385f0 sp 0x7ffe441385e8上的地址0x602000000274上的堆缓冲区溢出