如何解决在LC容易问题中使用向量会不断导致某种段错误Seg Fault Error 代码:
Leetcode问题:
Given the array nums consisting of 2n elements in the form [x1,x2,...,xn,y1,y2,yn].
Return the array in the form [x1,yn].
Example 1:
Input: nums = [2,5,1,3,4,7],n = 3
Output: [2,7]
Explanation: Since x1=2,x2=5,x3=1,y1=3,y2=4,y3=7 then the answer is [2,7].
这是我的代码:
class Solution {
public:
vector<int> shuffle(vector<int>& nums,int n) {
/*
1 2 3 4 5 6
[x1,x3,y3]
[x1,y3]
when combined,x will always be odd,y will always be even
*/
//declare vectors
vector<int> x (n,0);
vector<int> y (n,0);
vector<int> result(2*n,0);
//split nums param array
for(int i = 0; i < n; i++){
x[i] = nums[i];
}
for(int i = n; i < sizeof(nums); i++){
y[i] = nums[i];
}
int xCount = 0;
int yCount = 0;
//combine
for(int i = 0; i < result.size(); i++){
if(i % 2 != 0){ //if odd
result[i] = x[xCount];
xCount++;
}
else{
result[i] = y[yCount];
yCount++;
}
}
return result;
}
};
我不断收到此编译错误:
=================================================================
==30==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x6020000000dc at pc 0x000000376b62 bp 0x7ffeb6f4acb0 sp 0x7ffeb6f4aca8
WRITE of size 4 at 0x6020000000dc thread T0
#3 0x7fb40ba770b2 (/lib/x86_64-linux-gnu/libc.so.6+0x270b2)
0x6020000000dc is located 0 bytes to the right of 12-byte region [0x6020000000d0,0x6020000000dc)
allocated by thread T0 here:
#10 0x7fb40ba770b2 (/lib/x86_64-linux-gnu/libc.so.6+0x270b2)
Shadow bytes around the buggy address:
0x0c047fff7fc0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x0c047fff7fd0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x0c047fff7fe0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x0c047fff7ff0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x0c047fff8000: fa fa fd fa fa fa fd fa fa fa fd fa fa fa fd fa
=>0x0c047fff8010: fa fa fd fd fa fa 00 04 fa fa 00[04]fa fa fa fa
0x0c047fff8020: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
0x0c047fff8030: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
0x0c047fff8040: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
0x0c047fff8050: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
0x0c047fff8060: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
Shadow byte legend (one shadow byte represents 8 application bytes):
Addressable: 00
Partially addressable: 01 02 03 04 05 06 07
Heap left redzone: fa
Freed heap region: fd
Stack left redzone: f1
Stack mid redzone: f2
Stack right redzone: f3
Stack after return: f5
Stack use after scope: f8
Global redzone: f9
Global init order: f6
Poisoned by user: f7
Container overflow: fc
Array cookie: ac
Intra object redzone: bb
ASan internal: fe
Left alloca redzone: ca
Right alloca redzone: cb
Shadow gap: cc
==30==ABORTING
到底发生了什么?
我认为这可能与滥用向量有关……或者访问了一个不存在的索引……但是我正在检查我的代码,并且我相信它在范围之内(尽管解决方案可能不正确) )。只是为这个编译错误而烦恼...
解决方法
那是运行时错误,而不是编译器错误。
看代码,我会说sizeof(nums)
应该是nums.size()
。
-
您可能在此行(
y[i] = nums[i];
)中遇到错误。 -
您也可以将
sizeof
更改为std::size
:for(int i = n; i < sizeof(nums); i++){ y[i] = nums[i]; }
收件人:
int index = 0;
for(int i = n; i < std::size(nums); i++){
y[index] = nums[i];
++index;
}
我们可以使用更少的语句更轻松,更有效地解决问题:
std::vector<int> res;
for (int index = 0; index < n; index++) {
res.emplace_back(nums[index]);
res.emplace_back(nums[n + index]);
}
return res;
代码:
// The following block might slightly improve the execution time;
// Can be removed;
static const auto __optimize__ = []() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cout.tie(nullptr);
return 0;
}();
// Most of headers are already included;
// Can be removed;
#include <cstdint>
#include <vector>
static const struct Solution {
using ValueType = std::uint_fast16_t;
static const std::vector<int> shuffle(
std::vector<int>& nums,const int n
) noexcept {
std::vector<int> res;
for (ValueType index = 0; index < n; index++) {
res.emplace_back(nums[index]);
res.emplace_back(nums[n + index]);
}
return res;
}
};
// // The following block might slightly improve the execution time;
// // Can be removed;
// static const auto __optimize__ = []() {
// std::ios::sync_with_stdio(false);
// std::cin.tie(nullptr);
// std::cout.tie(nullptr);
// return 0;
// }();
// // Most of headers are already included;
// // Can be removed;
// #include <cstdint>
// #include <vector>
// static const struct Solution {
// using ValueType = std::uint_fast16_t;
// static constexpr std::vector<int>& shuffle(
// std::vector<int>& nums,// int n
// ) noexcept {
// for (ValueType slow = 0,fast = 0; fast < nums.size() - 1; ++slow,fast += 2) {
// nums[fast] |= ValueType(nums[slow]) << 16;
// nums[fast + 1] |= ValueType(nums[slow + n]) << 16;
// }
// for (auto& num : nums) {
// num >>= 16;
// }
// return nums;
// }
// };
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。