结构体数组大小设为93时程序终止,设为92时正常运行的原因咨询
结构体数组大小设为93时程序终止,设为92时正常运行的原因咨询
嗨,我来帮你理清楚这个问题~
你遇到的情况其实是栈溢出导致的,这在C语言里是很常见的新手坑,咱们一步步拆解:
首先,先算算你的Word结构体占多少内存:
eWord:50字节sWord:999字节sentence:10个每个999字节的数组,也就是10*999=9990字节
加起来总共大概是 11039字节(约11KB) 每个Word。
接下来看你的代码:在shuffleWords函数里,你声明了Word wordTemplate[MAXWORDS];——这是一个局部数组,局部变量是存储在程序的栈内存里的。而栈的默认大小是有限的(大多数系统里默认是1MB左右)。
那咱们算一下:
- 当
MAXWORDS=92时,这个数组占用的内存是92*11039≈1015KB,刚好在1MB的栈容量范围内,所以程序能正常运行。 - 当
MAXWORDS=93时,内存变成93*11039≈1026KB,超过了栈的最大容量,直接把栈撑爆了,程序就会意外终止。
怎么解决这个问题?
有两个简单的办法:
- 用动态内存分配:把局部数组改成用
malloc在堆上分配内存,堆的空间比栈大得多,不会轻易溢出。比如:
void shuffleWords(Word theWords[], int thePos) { // 动态分配数组,sizeof(Word)*MAXWORDS是总内存大小 Word *wordTemplate = malloc(sizeof(Word) * MAXWORDS); if (wordTemplate == NULL) { // 一定要检查分配是否成功 printf("内存分配失败!"); return; } Word hold; for(int i=0; i<thePos; i++) { wordTemplate[i]=theWords[i]; } // ... 后面的打乱逻辑不变 printEnglishWords(wordTemplate, thePos); free(wordTemplate); // 用完记得释放内存,避免内存泄漏 }
- 把数组改成全局变量:全局变量是存储在静态存储区的,不在栈里,所以不会受栈大小限制。你可以把
wordTemplate移到函数外面声明,不过全局变量尽量少用,因为会一直占用内存。
这样调整后,哪怕MAXWORDS设成100,程序也能正常运行啦~
备注:内容来源于stack exchange,提问作者Alexander Jonsson
相关产品推荐
相关产品推荐

