今天在写程序的时候,弹出这样的提示对话框:
应用程序发生异常 unknown software exception (0xc00000fd):
相关代码是这样,在一个函数中读取一个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