应用程序发生异常 unknown software exception (0xc00000fd)... - 栈溢出(Stack overflow)

时间:2023-01-27 16:36:36

今天在写程序的时候,弹出这样的提示对话框:

应用程序发生异常 unknown software exception (0xc00000fd):

应用程序发生异常 unknown software exception (0xc00000fd)... - 栈溢出(Stack overflow)

相关代码是这样,在一个函数中读取一个csv文件,先根据这个csv文件的大小,直接初始化一个变量,然后一次把整个文件读取并赋值给这个变量。

一开始测试时使用的一般都是几百K的小文件,没出现问题。当我选择一个1M多的图片时,就出现上面的问题了。

刚开始,从错误提示看,并没有提示说是: 栈溢出(Stack overflow)

经过在代码中设置断点,找到关键代码是: char csv_content_ucs[fileSize];

当文件很大时,就需要在栈上开一个很大的空间,超出系统限制,就会弹出上面的错误。

解决办法也很简单: 使和堆来存放数据就行了malloc(fileSize)

关于栈溢出(Stack overflow)的一些网上资料:

来源:http://blog.csdn.net/zhongjling/article/details/8073796

解释:

一般每个进程的栈空间是限定的。(为什么限定?去学汇编和操作系统就知道)

一般为1M或2M。

什么占用栈空间?

除去系统栈占用外,基本就是栈变量。(什么是栈变量?无语¥%*&……%¥%&)

简单来说上面那个a就是栈变量。

修改有两个办法:

一 改为堆变量:

int* pa = malloc(sizeof(int)*1000*1000);

然后可以将pa当数组用。(数组和指针在C里基本等同)

当然,不用了记得free pa。

二  修改系统限制

这个栈变量= 1000*1000*4 = 4M。(约等于)

如果这个函数不频繁调用,也不递归,一般还是可以接受。

可以修改操作系统对进程栈空间的大小限制,稍微调大一些。

ulimit查看系统的限制。(*nix系统命令。不是windows的)

当然方法二非常不值得推荐

2014-06-26