这个程序是用来测试用动态分配内存的方式创建一维数组的。
但是我发现只要这个循环变量i超过了3,一旦释放动态内存就会出错。
目前只知道,比如当i=4的时候,赋值的地址就会超过所分配的动态内存空间。
但这个原理是什么?求助
谢谢!!!
void main()
{
double *arr = (double *)malloc(24);
for (int i = 0; i < 3; i++)
{
arr[i] = i + 1;
printf("%f\n", arr[i]);
}
free(arr);//只要i超过3个 执行free就会出问题
getchar();
}
问题出在 i=4 的时候,你去写了 arr[i]。
你使用 malloc ,实际上系统会在为你在给你返回的内存地址前后分配额外的内存,这段内存记录了你申请的空间大小等元信息。
而你越界访问后,就改写了这段范围后面的额外内存,然后 free() 是要依赖这里的信息的。
你可以试试 如果不去写越界,而只是读 arr[4], 就不会报错了!