簡體   English   中英

在陣列中檢測到 C 堆棧粉碎

[英]C stack smashing detected in array

我正在嘗試解決一個問題。

如果在數組中重復了一個數字,我將他設為 0。我的代碼拋出錯誤,您能幫幫我嗎?

#include <stdio.h>

int main() {
int a[] = {-3, -2, -1, -7, -3, 2, 3, 4, 2, 7, 10, 3}; 
int length = 12; 

int zero_duplicates(int laenge, int *a) {
    int zero[] = {};
    int k = 0;
    int j = 1;

    for(int x=0; x<laenge; x++)
    {
        if (zero[*a] == 1) {
            *a = 0;
        } else {
            zero[*a] = 1;
            k++;
        }
        a++;
    }
return k;
}


int count = zero_duplicates(length, a); 


printf("%d -- ", count); 

for(int i = 0; i < length; i++) printf(" %i ", a[i]);

return 0;
}

這個...

 int zero[] = {};

... 不是 C 中的有效數組聲明。 如果你的編譯器接受它作為擴展,那么它至少應該發出警告,即使這樣,它也可能並不意味着你認為它的意思。 具體來說,最可能的擴展之一是將其解釋為聲明一個長度為零的數組(這也將構成一個擴展),這樣訪問任何元素都會超出數組邊界。

此外,無論數組有多長,如果輸入數組的任何元素為負數(如示例中的情況),則當a指向 1 時, zero[*a]將構成越界訪問那些元素。

總的來說,您需要一種不同的方法。 你試圖做的事情是不可行的。

另外,C 不支持嵌套函數,因此您的代碼在這方面依賴於另一個擴展。 這個特殊問題可以通過將嵌套的 function 提升出main()來解決,但是,將其放在上面而不是里面。

暫無
暫無

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

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