This question already has answers here:
Getting a stack overflow exception when declaring a large array
(8个答案)
2年前关闭。
我正在创建一个线程,该线程将捕获数据包并将一些信息存储在每个数据包的结构“流”中。我正在使用“流”类型结构的静态数组。但是当我运行程序时,它会重新调整SIGSEGV错误。这是结构“流程”:
请注意,flowParam是另一个结构,其对象信息包含在“流”中。我也通过评论运行程序,但结果相同...
这是主程序:
有趣的是,当我使用另一个结构“计数器”并使它的数组成为线程时,它不会给出这样的错误。
我尽力解决此问题,但找不到任何线索。有帮助吗???
(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);
}