This question already has answers here:
Getting a stack overflow exception when declaring a large array
                                
                                    (8个答案)
                                
                        
                                2年前关闭。
            
                    
我正在创建一个线程,该线程将捕获数据包并将一些信息存储在每个数据包的结构“流”中。我正在使用“流”类型结构的静态数组。但是当我运行程序时,它会重新调整SIGSEGV错误。这是结构“流程”:

typedef struct flow
{
    unsigned int s_port;
    unsigned int d_port;
    char s_addr[20];
    char d_addr[20];
    int spi;
    short total;
    short data[10000];
    struct timeval prev_t;
    double ipt[10000];
    flowParam info;
    char status[100];

}flow;


请注意,flowParam是另一个结构,其对象信息包含在“流”中。我也通过评论运行程序,但结果相同...

这是主程序:

int main()
{
    pthread_t tid;

    int err = pthread_create(&tid, NULL, Capture, NULL);
        if (err != 0){
            perror("\ncan't create capturing thread");
            exit(-1);
        }
        else
            printf("\nCapturing thread created!\n");

    pthread_join(tid, NULL);
    printf("Finished!!");
    return 0;
}

void* Capture()
{
    flow Register[5000]; /* flow Register */
    //counter Counter[5000];
    pthread_exit(NULL);

}


有趣的是,当我使用另一个结构“计数器”并使它的数组成为线程时,它不会给出这样的错误。

typedef struct counter
{
    char s_addr[20];
    char d_addr[20];
}counter;


我尽力解决此问题,但找不到任何线索。有帮助吗???

最佳答案

您的struct flow非常大,超过100KB。 5000个阵列大约为500MB。通过将Register设置为最有可能存在于堆栈中的局部变量,它会变得太大而导致堆栈溢出。这会导致段错误。

您应该改为为其动态分配内存。它仍然是一个大结构,但是有更大的机会在堆上为其存储内存。

void* Capture()
{
    flow *Register = malloc(5000 * sizeof(flow));
    ...
    free(Register);
    pthread_exit(NULL);

}

10-06 05:50
查看更多