在 C 中创建大型数组时出现分段错误

Posted

技术标签:

【中文标题】在 C 中创建大型数组时出现分段错误【英文标题】:Segmentation Fault While Creating Large Arrays in C 【发布时间】:2013-02-23 09:08:12 【问题描述】:

你们用这段代码帮了我很多。让我先说我不太了解 C,并且正在努力做到这一点。

这是程序应该做的:

    创建一个长度为 1000 万的随机数列表 使用 shell 排序函数对随机数列表进行排序(仍然无法正常工作……我认为这是我将指针传递给函数的方式) 列出一百万长的列表 在记录时间时最多重复 1 亿次(由于某种原因,时间显示为 0.0000000)

我只是想测试这个 shell 排序程序与标准库中内置的快速排序。

我尝试过使用和不使用指针。注释掉的部分在完成后应该可以工作。它只会让事情变得更糟,哈哈

请帮帮我,你们到目前为止都很棒......

#include <stdio.h>
#include <stdlib.h>
#include <time.h>


void shellSort(int *A, int n);
void checkSort(int *A, int n);

int main()

    /*Initialize Random Array*/
    int unsorted_list[10000000];
    int *ptr = &unsorted_list[0];
    int random_number;
    int i;

    srand ( time(NULL) );
    for(i=0; i<10000000; i++)

        random_number = rand();
        unsorted_list[i] = random_number % 10000000;
    

    //Do C Shell Sort
    double shell_results[10][2];

    double clock_diff;
    int j=10000000;
    clock_t t0, t1;
    int k;


    for(i=0;i<10;i++)



        /*Sort the list using shellSort and take the time difference*/
        t0 = clock();
        shellSort(ptr, j);
        t1= clock();

        /*Take difference in time*/
        clock_diff = (t1 - t0)/CLOCKS_PER_SEC;

        /*Add time and list length to the results array*/
        shell_results[i][0] = (double)j;
        shell_results[i][1] = clock_diff;


        /*Check to make sure the array has been sorted*/
        checkSort(ptr, j);

        /*Re-initialize a longer array*/
        //j+=1000000;
        //for(k=0; k<j; k++)
        //    random_number = rand();
        //    unsorted_list[k] = random_number % 1000000;
        //

        printf("%d",(int)shell_results[i][0]);
        printf(" ");
        printf("%f",shell_results[i][1]);
        printf("\n");

    





 return 0;
 

 void shellSort(int *A, int n)



     int gap , i , j , temp;

     for (gap = n/2; gap>0; gap /=2)
         for (i=gap; i<n; i++)
             for(j = i-gap; j>=0 && A[j] > A[j+gap]; j-=gap)
                 temp = A[j];
                 A[j] = A[j + gap];
                 A[j + gap] = temp;
     
 



void checkSort(int *A, int n)

    int i;

    for(i=0;i<n;i++)

        if(A[i]>A[i+1])

            printf("Error in sorting \n");
            break;
        
    

【问题讨论】:

Explanation of why allocating a large array results in segmentation fault in C, Segmentation fault on large array sizes, Why do I get a segfault in C from declaring a large array on the stack?, why does this large array declaration produce a segmentation fault? C programming, why does this large array declaration produce a segmentation fault?的可能重复 【参考方案1】:

您可能没有 10 兆字节的堆栈空间。将该数组设为全局,使用static 声明它,或者使用malloc() 动态分配它。如果你选择后者,别忘了free()它。

稍后,当你需要使用 100,000,000 个元素的数组时,一定要为它使用新的分配!

【讨论】:

我应该从大小为 100,000,000 的数组开始吗?还是继续制作新的? 你当然可以这样做,是的。【参考方案2】:

嗯,你不可能在堆栈上拥有这么多的可用空间。使用 malloc() 从堆中分配它。记得之后释放()它。

【讨论】:

以上是关于在 C 中创建大型数组时出现分段错误的主要内容,如果未能解决你的问题,请参考以下文章

尝试在 C 中使用 realloc 扩展数组时出现分段错误错误 [关闭]

初始化数组时出现段错误

c中的memset struct数组时出现分段错误

分段错误:在 Mac 上为 11,但在 Linux 上没有,同时在 C 中创建数组

尝试声明大数组时出现分段错误和核心转储[重复]

返回指针时出现分段错误[重复]