c - 从小测试文件切换到 31 mb 文件时出现 SegFault

标签 c multithreading

下面是我的合并排序项目的(不完整)代码。这对于我已经实现的部分工作得很好,直到我从 128 行测试文件切换到应该排序的 31 mb 文件。现在出现段错误,我不知道该怎么做才能解决这个问题。

删除了一些我认为无关紧要的行,因为“主要是代码”。

struct Record {
    char key[KEYSIZE+1];
    char data[DATASIZE+1];
};
int threadCount;
int tiers;
static struct ThdArg {
        int thdNum; // Thread number 0,1,2,3
        struct Record * lowRec; // First record of group or first index of record
        struct Record * hiRec;  // Last record of group or last index of record   
};


int lines;
int tiers;
void *threadFunc(void *var)
{
    struct ThdArg temp2 = *((struct ThdArg*)var);
    qsort((temp2.lowRec), lines/threadCount, sizeof(struct Record), comparator);
    for(int k=0;k<tiers;k++)
        if(temp2.thdNum%(int)(pow(2,k+1))==0)
        {
            qsort((temp2.lowRec), lines/(threadCount/(int)pow(2,k+1)), sizeof(struct Record),comparator);   

        }
}

int main(int argc, char **argv[])
{
    if (argc!=2)
    {
        printf("Please enter a file name");
        return 0;
    }
    threadCount =8;

    tiers =(int)log2((double)threadCount);
    pthread_t threads[threadCount];
    FILE *recordFile=fopen(argv[1], "r");
    char ch;
    fseek(recordFile, 0, SEEK_END);
    lines = ftell(recordFile);
    fseek(recordFile, 0, SEEK_SET);
    lines=lines/64;

    struct Record recArr[lines]; 

    char  buffer[9];
    char buffer2[57];
    for(int j=0;j<lines;j++)
    {
        fgets(buffer, 9, recordFile);
        for(int i=0;i<8;i++)
        {
            recArr[j].key[i]=buffer[i];
        }
        recArr[j].key[8]='\0';
        fgets(buffer2, 57, recordFile);
        for(int i=0;i<56;i++)
        {
            recArr[j].data[i]=buffer2[i];
        }
        recArr[j].data[57]='\0';
    }
    struct ThdArg temp[threadCount];
    for(int i=0;i<threadCount;i++)
    {
        temp[i].thdNum = i;
        temp[i].lowRec=&recArr[(lines/threadCount)*i];
        temp[i].hiRec=&recArr[(lines/threadCount)*(i+1)-1];
        pthread_create(&threads[i],NULL, threadFunc, (void *)&temp[i]);
    }
    for(int i=0;i<threadCount;i++)
    {
        pthread_join(threads[i], NULL);
    } 

}

最佳答案

以下行:

struct Record recArr[lines]; 

在堆栈上分配内存。它的大小受到限制。 如果您读取一个非常大的文件,请使用 malloc:

#include <stdlib.h>

typedef struct  {
    char key[KEYSIZE +1];
    char data[DATASIZE +1];
}Record;

...

recArr = malloc(sizeof(Record) * lines);
...
free(recArr);

您可以像数组一样使用指针。 (其实它们是一样的)

关于c - 从小测试文件切换到 31 mb 文件时出现 SegFault,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47737540/

相关文章:

c - 嗨,我有点困惑,我只是在 linux 中玩 gdb,我遇到了这个

c++ - C 标准库可扩展性对 C++ 程序有多大影响?

C# 线程和 Windows 窗体

您可以静态编译 cygwin 应用程序吗?

c - 尝试释放时程序崩溃()

python - 使用 Python 的多线程 MySql 插入

node.js - 工作线程如何在 Nodejs 中工作?

c++ - atomic.store 和atomic_thread_fence 有什么区别?

java - 如何在Java中使用内联类中断线程

c - 将操作应用于 C 中的整个内存块