在LeetCode上刷題的時候,本地運行正常且正確,但提交併運行時出現了報錯
AddressSanitizer: stack-buffer-overflow on address 0x7ffe82398280 at pc 0x000000405a55 bp 0x7ffe82398050 sp 0x7ffe82398048
瞬間有點蒙,這不是簡單題嘛?我的解法不挺簡單的嘛?
題目鏈接: 498. 對角線遍歷.
報錯了的解答(刪減版):
class Solution {
public:
vector<vector<int>> *pubMatrix;
vector<int> findDiagonalOrder(vector<vector<int>>& matrix) {
pubMatrix = &matrix;
……
while(exist(i, j)) {
……
}
return vec;
}
bool exist(int i, int j) {
return (pubMatrix->size() > i && pubMatrix[i].size() > j && i >= 0 && j >= 0);
}
};
這裏我用了一個循環,普通的循環會導致stack-buffer-overflow
嘛?好像不會的吧?
如果是棧的話,一般和函數調用有關。看一下報錯內容,裏面的兩個棧指針bp 0x7ffe82398050
sp 0x7ffe82398048
,兩者地址相減只有0x8,這個棧未免也太小了吧,這就溢出了……
應該是LeetCode對這題比較嚴格,畢竟是簡單題,內存限制比較緊吧
把調用函數去掉試試,這樣就可以避免函數調用使用棧空間了(成功通過了):
#define exist(i, j) (matrix.size() > i && matrix[i].size() > j && i >= 0 && j >= 0)
class Solution {
public:
vector<int> findDiagonalOrder(vector<vector<int>>& matrix) {
pubMatrix = &matrix;
bool iIncrease = false;
……
while(exist(i, j)) {
……
}
return vec;
}
};
這裏用一個define
替代了函數,裏面的內容,會在代碼被編譯的時候,自動替換掉。既可以讓代碼整潔一點,又能避免函數調用使用棧空間。
調試靠瞎猜,哈哈哈。