再比如我们创建一个数组,如:
int arr[10]={0};
这时数组内容仍然存储在栈区中,由编译器分配空间存储或销毁.
这样的内存使用方式有两个特点:
内存空间开辟大小是固定的....数组在声明的时候,必须指定数组的长度,它所需要的内存在编译时分配....++)
{
*(p + i) = i;//当i是10的时候会造成越界访问
}
free(p);
}
在vs2022中测试该代码:
可以看到,编译器直接报错"检测到堆损坏...".像这种报错不论是说栈区损坏,还是堆区损坏,意思就是在栈上或堆上出现了越界访问的情况....因此,在使用动态内存开辟空间时,我们要格外小心不要出现越界访问的问题.
3.对非动态开辟内存使用free释放
因为p是由编译器分配到栈区的,不属于堆区,因此不能使用free释放.
void test