繁体   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