使用数组时无法找出 "Thread 1: EXC_BAD_ACCESS" 错误

Can't figure out "Thread 1: EXC_BAD_ACCESS" error while working with arrays

我正在研究一种按升序对输入的整数进行排序的算法。

输入应该排序

5
32
45
32
55
67

和排序的输出

32
32
45
55
67

其中第一个整数输入是将要输入的整数个数。

n.b。输入的整数 n 为 1 <= n <= 10,000,000.

这是我的代码:

#include <stdio.h>

int main() {
    int N;
    scanf("%d", &N); // receives the number of integers that will be inputted
    int countArray[10000000] = {0}; // creates an array that will store the number of times a number is inputted. the inputted number is the corresponding address e.g. countArray[number-1] stores the amount of times the number 'number' is inputted.

    int inputArray[N]; // creates an array of the numbers inputted
    for (int i=0; i<N; i++) {
        scanf("%d", &inputArray[i]); // receives the numbers inputted and stores them in the inputArray
    }
    for (int i=0;i<N;i++) {
        countArray[inputArray[i]-1]++; // counts the number of times a number occurs in inputArray and increments the corresponding value in the countArray.
    }
    int i=0;
    while (i<10000000) {
        if (countArray[i] > 0) {
            for (int j=0;j<countArray[i];j++) { // prints out the numbers only if count is greater than 0.
                printf("%d\n", i+1);
            }
        }
        i++;
    }
    return 0;
}

我知道我的代码不是对输入进行排序的最有效方式;我很好奇为什么在数组大小为 10,000,000 时出现“Thread 1: EXC_BAD_ACCESS”错误,但在 1,000,000 时却没有。如果数组的大小为 1,000,000,它就可以正常工作,但当它为 10,000,000 时就不行了。

您的示例代码 至少可以编译 ,但 不会 运行。它 seg-faults 开始 .

使用 GCC + Linux,我得到 Segmentation fault (core dumped) 并以代码 139 退出,而在我的 Mac 和 Clang 上,我得到 Segmentation fault: 11 具有相同的退出代码。我怀疑您的 EXEC_BAD_ACCESS 是某个版本,其中包含 相同的 基本问题。

正如 @tevemadar 所指出的,您在堆栈中请求 ~ 40 MiB 数据,很明显,您是 不会会得到。

所以,而不是这个:

int countArray[10000000];

这样做 :

int *countArray = malloc(10000000*sizeof(int));

static int countArray[10000000];

哪个应该工作(不要忘记检查NULL),因为malloc()将return一个指针指向它在中分配的内存,并且全局变量也放在堆中,其中大小限制不像 堆栈 那样限制性强,并且对于大多数实际用途而言,记住这一点并不重要。


现在,进入我的一些杂谈 -

您实际上非常 超出了允许的堆栈大小。我不自称是专家,但到现在为止,这对你来说肯定也是self-evident。

您的尝试在某种程度上是对堆栈的滥用,可能是由于没有被告知堆栈目的背后的想法——大多数 C 教科书和课程都犯了这样的错误:(

我不是专家,不会为你破坏概念的美感,但总结一下-

堆栈用于存储较小的局部变量函数,如计数器,要打印的字符串、return 值等。一般来说,除非您 malloc()fopen()static ,否则所有内容都将放在此处。对于 malloc().

来说很傻的小而方便的变量没问题

是一个巨大的内存区域,用于批量使用 如链表、长数组、树、大结构等等。这是你应该存储seriously-sized变量的地方,这些变量存储大量数据


所以,长话短说,对大数据类型使用,使用小变量堆栈,这对malloc().