【问题标题】:Why do I get the stack smashing error while working with arrays in c?为什么在 c 中使用数组时会出现堆栈粉碎错误?
【发布时间】:2022-07-07 19:56:02
【问题描述】:

我正在尝试解决 3Sum 问题,但我不知道为什么我总是收到 ''*** stack smacking detected ***: terminate'' 错误,代码如下:

#include <stdio.h>
int proc(int t[], int n, int* r) {
  int c=0;
   for(int i=0; i<n; i++){
       for(int j=0; j<n; j++){
           for(int k=0; k<n; k++){
               if(i!=j!=k){
                  if(t[i]+t[j]+t[k]==0){
                     r[c]=t[i];
                      c++;
                     r[c]=t[j];
                     c++;
                     r[c]=t[k];
                     c++;
                   }
                }
            }
        }
    }

    return c;

}
void main(){
    
     int t[6]={-1,0,1,2,-1,-4}, r[6], c;
    
  c=add(t, 6, r);
  
  for(int i=0; i<c; i++)
     printf("%d ", r[i]);


}

【问题讨论】:

  • 与您的问题无关,但i!=j!=k 是错误的。
  • add(...) 函数是否调用了对proc 的调用?应该是int main(),而不是void main()

标签: arrays c


【解决方案1】:

您的程序存在许多问题(例如,i!=j!=k 不会像您想象的那样工作)。

但是堆栈粉碎的原因是您将 c 递增到超过数组大小的点,然后您执行 r[c]。当您尝试访问大于数组大小的索引时,您会收到错误消息。

例如,如果你替换你的

int t[6]={-1,0,1,2,-1,-4}, r[6], c;

通过

int t[6]={-1,0,1,2,-1,-4}, r[1000], c;

(实际上不要这样解决这个问题) 您将看到错误不再发生,因为 c 永远不会超过 r 数组的大小...

解决办法是预先计算c的最大值,或者使用不同的数据结构。

【讨论】:

    【解决方案2】:

    如果您使用调试器并逐步运行程序,您可以轻松找到问题。 i!=j!=k 不正确,您的意思可能是 i!=j &amp;&amp; j!=ki!=j &amp;&amp; j!=k &amp;&amp; i!=k

    但最重要的是c 经过几次循环后大于 6,因此您超出了数组范围

    【讨论】:

      【解决方案3】:

      这个 if 语句

      if(i!=j!=k){
      

      等价于

      if ( ( i != j ) != k ){
      

      如果 i 不等于 j,表达式 i != j 的计算结果要么为 1,否则为 0。

      所以你将有两个

      if ( 1 != k ){
      

      if ( 0 != k ){
      

      而不是

      if(i!=j!=k){
      

      你需要写

      if ( ( i != j ) && ( j != k ) && ( i != k ) ){
      

      【讨论】:

        猜你喜欢
        • 2021-09-05
        • 1970-01-01
        • 1970-01-01
        • 2018-08-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-31
        相关资源
        最近更新 更多