【问题标题】:Stack smashing detected after one successful一次成功后检测到堆栈粉碎
【发布时间】:2021-01-13 03:51:28
【问题描述】:

在我的麻烦中,当我执行程序时,在正确的输出时间(可能更多时间)之后,第二个导致“检测到堆栈粉碎”错误! (我执行相同的二进制文件)。 谁发现这里的问题?为什么 ? 我的命令:

phuocblack@phuocblack-X455LAB:~/.project$ gcc TEST.c -o a phuocblack@phuocblack-X455LAB:~/.project$ ./a 1 2 3 3 4 5 7 12 22 66 phuocblack@phuocblack-X455LAB:~/.project$ ./a -1591423488 1 2 3 3 4 5 7 12 22 *** 检测到堆栈粉碎 ***: ./a terminate Aborted (core dumped)

我的代码:

#include <stdio.h> 

void swapp(int *a, int *b)
{
    int temp = *a;
    *a = *b;
    *b = temp;
}

int main(void) 
{   
    int i = 0;
    int arr[10] = {12,3,4,5,2,66,7,1,22,3};
    
    while (i < 10)
    {
        if (arr[i] <= arr[i+1])
        {
            i++;
        }
        else
        {
            swapp(&arr[i], &arr[i+1]);
            if (i > 0)
            {
                i--;
            }
        }
    }
    
    for (int i = 0; i < 10; i++)
    {
        printf("%d ", arr[i]); 
    }
    printf("\n");
    return 0; 
} 

请在此处解释它的显示方式和内存问题!我是新人@@

【问题讨论】:

  • 表达式if (arr[i] &lt;= arr[i+1]) 将导致对数组的越界访问。即arr[10]swapp(&amp;arr[i], &amp;arr[i+1]);
  • 那为什么第一次是正确的!?
  • i == 9 然后i+1 = 10,然后arr[i+1] 访问arr[10] 超出范围。

标签: c memory out-of-memory


【解决方案1】:

问题是当您的参数i == 9 尝试访问您没有的第 10 个单元格时。 这个错误出现在两个地方:if (arr[i] &lt;= arr[i+1])swapp(&amp;arr[i], &amp;arr[i+1]);。 这里修复了有效的代码:

    while (i < 10 && i + 1 < 10) {
        if (arr[i] <= arr[i + 1])
            i++;
        else {
            swapp(&arr[i], &arr[i + 1]);
            if (i > 0)
                i--;
        }
    }
    

另一个问题是你在C平台上工作所以换行:

   for (int i = 0; i < 10; i++)

到:

    i = 0;
    for (i; i < 10; i++)

原因是你不能在循环中再次设置变量。

【讨论】:

    猜你喜欢
    • 2012-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-24
    相关资源
    最近更新 更多