【问题标题】:Cant figure out the testcase where I am getting segmentation fault?无法弄清楚我遇到分段错误的测试用例?
【发布时间】:2022-01-23 04:54:26
【问题描述】:

我遇到了一些未知测试用例的分段错误,我无法解决它。 它适用于大多数情况。我只想知道在哪种情况下我会遇到分段错误。 该代码是为直方图中的问题 Maximim Rectangular Area 编写的。你可以在这里查看这个问题:https://practice.geeksforgeeks.org/problems/maximum-rectangular-area-in-a-histogram-1587115620/1#

下面是代码:

 long long getMaxArea(long long arr[], int n)
    {
        int nsl[n];
        int nsr[n];
        stack<int>s;
        // nsl
        for(int i=0;i<n;i++)
        {
            if(i==0)
            {
                nsl[i]=-1;
                s.push(i);
            }
            else{
                while(!s.empty())
                {
                    if(arr[s.top()]<arr[i])
                    break;
                    s.pop();
                }
                if(s.empty())
                nsl[i]=-1;
                else
                nsl[i]=s.top();
                s.push(i);
            }
        }
        stack<int>st;
        // nsr
        for(int i=n-1;i>=0;i--)
        {
            if(i==n-1)
            {
                nsr[i]=n;
                st.push(i);
            }
            else{
                while(!st.empty())
                {
                    if(arr[st.top()]<arr[i])
                    break;
                    st.pop();
                }
                if(st.empty())
                nsr[i]=n;
                else
                nsr[i]=st.top();
                st.push(i);
            }
        }
        long long ans=0;
        for(int i=0;i<n;i++)
        ans=max(ans,arr[i]*(nsr[i]-nsl[i]-1));
        return ans;
    }

【问题讨论】:

  • 我们需要足够的代码来复制问题。
  • 请注意 int nsl[n]; 不是有效的 C++
  • C++ 没有变长数组。
  • int nsl[n]; -- 如果n 足够大,则说明您已耗尽堆栈内存。不要这样做,无论如何它都不是有效的 C++。使用std::vector&lt;int&gt; nsl(n), nsr(n);。此外,您链接到的那个网站包含糟糕的 C++ 代码示例。哇哦,去那个网站并使用 Visual C++ 的人。他们必须将正在使用的糟糕、无效的 C++ 语法转换为有效的语法,以便它可以编译。
  • @user4581301 -- 如果使用std::vector 解决了整个问题,那么这个问题应该被存档,并成为说明为什么这些网站是垃圾编码网站的主要例子。

标签: c++ stack


【解决方案1】:

通过使用向量而不是数组来解决问题。我只是对数组使用了错误的 c++ 语法,因此使用向量就解决了它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-26
    • 1970-01-01
    • 1970-01-01
    • 2015-08-08
    • 1970-01-01
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    相关资源
    最近更新 更多