这是程序,
#include<stdio.h>
#include<stdlib.h>
int main()
{
int a[] = {1,2,3,4}; //static array
int *x = (int*)malloc(5*sizeof(int)); //dynamic array
printf("a[-1] - > %d", a[-1]);
printf("x[-1] -> %d", x[-1]);
//printf("a[-31924] -> %d", a[-31924]);
/*this will give segmentation fault, but no segmentation fault from -1 to -31923 */
//printf("x[-5] -> %d", x[-5]);
/*this will give segmentation fault, but no segmentation fault till -1 to -4 */
return 0;
}
以上程序将正常工作,并将打印两个垃圾值。我从过去2年开始用C语言编写代码,但这对我来说是新的(非常奇怪)
我不知道这是如何工作的-ve索引值,它应该给我一些运行时错误(分段错误)访问未分配给程序的内存? (这是我迄今为止的观察)
如何在C中分配内存,是否在数组的两端分配了一些额外的内存或者是什么?
什么时候会发生分段错误?
我已经多次问过这个问题了,但我想知道这个程序。
另请注意,静态分配时的数组不会给负值高达-31923的分段错误,动态分配的数组不会给-ve值高达-5的分段错误。这是与堆栈和堆相关的东西,但请任何人都可以解释。