簡體   English   中英

一次成功后檢測到堆棧粉碎

[英]Stack smashing detected after one successful

在我的麻煩中,在我執行程序的正確輸出時間(可能更多時間)之后,第二個導致“檢測到堆棧粉碎”錯誤! (我執行相同的二進制文件)。 誰發現這里的問題? 為什么 ? 我的命令:

phuocblack@phuocblack-X455LAB:~/.project$ gcc TEST.c -oa 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 終止中止(核心轉儲)

我的代碼:

#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++)

原因是你不能在循環中再次設置變量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM