当前位置: 技术问答>linux和unix
有关malloc函数的问题
来源: 互联网 发布时间:2016-04-17
本文导语: 1 #include 2 #include 3 4 int main() 5 { 6 int *a; 7 a = (int *)malloc(sizeof(int)); //若注释掉此句,则报告Segmentation fault (core dumped) 8 a[10] = 1; 9 return 0; 10} 上述代码能够编译运行。 疑问...
1 #include
2 #include
3
4 int main()
5 {
6 int *a;
7 a = (int *)malloc(sizeof(int)); //若注释掉此句,则报告Segmentation fault (core dumped)
8 a[10] = 1;
9 return 0;
10}
上述代码能够编译运行。
疑问:malloc函数只分配了一个int类型的存储空间,为什么能对a[10]进行赋值呢?
2 #include
3
4 int main()
5 {
6 int *a;
7 a = (int *)malloc(sizeof(int)); //若注释掉此句,则报告Segmentation fault (core dumped)
8 a[10] = 1;
9 return 0;
10}
上述代码能够编译运行。
疑问:malloc函数只分配了一个int类型的存储空间,为什么能对a[10]进行赋值呢?
|
你这个程序是错误的!
a[10]不报告segment fault是因为操作系统并不知道数组越界,而只知道访问的地址是否操作系统有效地址,数组越界是需要程序自己保证的! 数组越界问题在编程中非常难查,而且莫名奇妙。所以一定要小心!
a[10]是在堆上分配的空间,就算a[10]不报错,a[一个非常大的数字]肯定会报错的!
a[10]不报告segment fault是因为操作系统并不知道数组越界,而只知道访问的地址是否操作系统有效地址,数组越界是需要程序自己保证的! 数组越界问题在编程中非常难查,而且莫名奇妙。所以一定要小心!
a[10]是在堆上分配的空间,就算a[10]不报错,a[一个非常大的数字]肯定会报错的!
|
this is the key point!
LZ,you can get the principle on chapter 3 & 9,10