【问题标题】:Line 1034: Char 9: runtime error: reference binding to null pointer of type 'int' (stl_vector.h)第 1034 行:字符 9:运行时错误:引用绑定到类型为“int”的空指针 (stl_vector.h)
【发布时间】:2021-05-10 13:28:58
【问题描述】:

我正在解决 leetcode 问题合并排序数组,在​​ leetcode 上运行以下代码时出现运行时错误

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

示例 1: 输入:nums1 = [1,2,3,0,0,0],m = 3,nums2 = [2,5,6],n = 3 输出:[1,2,2,3,5,6]

示例 2: 输入:nums1 = [1],m = 1,nums2 = [],n = 0 输出:[1]

我的代码:

class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
    int i = 0, j = 0, k = m-1;
    
    while(i<=k && j<m) {
        if(nums1[i] < nums2[j]) {
            i++;
        }
        else {
            swap(nums2[j++], nums1[k--]);
        }
    }
    sort(begin(nums1), begin(nums1) + m );
    sort(begin(nums2), end(nums2));
    
    k = m + 1;
    for(int l = 0; l < n; l++) {
        nums1[k] = nums2[l];
        k++;
    }
}
};

【问题讨论】:

  • 想想j &lt; m,哪个向量j索引,哪个向量的大小是m
  • 对谁说只是使用调试器,附议。
  • @underscore_d 是我,但我删除了我的评论并将其变成了答案。我在此过程中丢失了调试器建议 :-) 我现在已将其添加到答案中。
  • @molbdnilo 谢谢!你说得对,应该是j &lt; n

标签: c++ array-merge


【解决方案1】:

这个:

k = m + 1;

使其跳过k[m] 处的插槽,并使for 循环访问nums1 越界,因为k 将到达6nums1[6] 越界。

制作:

k = m;

Demo

注意:如果您使用调试器,甚至在代码中添加打印输出以便查看索引变量的值,则很容易发现此类错误。

【讨论】:

  • @doggone_boy 与您在问题中显示的数据不同(查看演示)。您可能还有其他错误,例如对矢量大小做出假设等。问题中的错误应该通过此更改来解决。
  • 是的,我找到了第二个。谢谢! @TedLyngmo
猜你喜欢
  • 2022-01-07
  • 2019-11-17
  • 1970-01-01
  • 1970-01-01
  • 2022-06-03
  • 1970-01-01
  • 2020-01-03
  • 2021-04-30
  • 2022-08-20
相关资源
最近更新 更多