一次成功后检测到堆栈粉碎

Stack smashing detected after one successful

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

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 *** stack smashing detected ***: ./a terminated 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; 
} 

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

问题是当您的参数 i == 9 试图访问您没有的第 10 个单元格时。 这个错误出现在两个地方:if (arr[i] <= arr[i+1])swapp(&arr[i], &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++)

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