在int main()内外声明数组的差异及段错误原因解析
数组在main函数内外声明的差异分析
先看两段解决HackerRank数组操作问题的代码:
CASE 1:在main内部声明数组(运行出现段错误)
#include <stdio.h> int main() { int n; int m; long long arr[10000005]; scanf("%d %d", &n, &m); int index1, index2, summand; for (int i = 0; i < n; i++) { arr[i] = 0; } while (m--) { scanf("%d %d %d", &index1, &index2, &summand); arr[index1-1] += summand; arr[index2] -= summand; } long long max = 0, temp = 0; for (int i = 0; i < n; i++) { temp += arr[i]; if (temp >= max) { max = temp; } } printf("%lld", max); }
CASE 2:在main外部声明数组(正常通过所有测试用例)
#include <stdio.h> long long arr[10000005]; int main() { int n; int m; scanf("%d %d", &n, &m); int index1, index2, summand; for (int i = 0; i < n; i++) { arr[i] = 0; } while (m--) { scanf("%d %d %d", &index1, &index2, &summand); arr[index1-1] += summand; arr[index2] -= summand; } long long max = 0, temp = 0; for (int i = 0; i < n; i++) { temp += arr[i]; if (temp >= max) { max = temp; } } printf("%lld", max); }
核心差异说明
两段代码唯一的区别是数组arr的声明位置,导致运行结果不同的核心原因是内存分配区域的差异:
- main内部声明的数组属于局部变量,会被分配到**栈(Stack)**内存中。栈的空间通常很小(一般为几MB级别,具体大小由操作系统和编译环境决定)。你的数组
long long arr[10000005]占用内存约76MB,远超过栈的可用空间,直接触发栈溢出,导致segmentation fault(段错误)。 - main外部声明的数组属于全局变量,会被分配到静态存储区(Static Storage Area)。这个区域的内存空间远大于栈,通常可以容纳几百MB甚至更大的数据,因此大数组放在这里不会出现内存不足的问题,能正常运行。
额外补充:全局变量在程序启动时会被自动初始化为0,因此CASE2中的for (int i = 0; i < n; i++) arr[i] = 0;代码可以省略,不影响程序功能。
内容的提问来源于stack exchange,提问作者BiscuitBreaker
相关产品推荐
相关产品推荐

