为什么要使用动态内存?
通常当我们声明一个数组时必须要指定他的长度,但是数组的长度只有在程序运行时才知道,这是因为他所需的内存空间取决于输入数据的类型。这种方法虽然简单,但是他的缺点却极大的限制了程序的灵活性和健壮性。
这种方式收到了人为限制,一但我们输入的数据元素超过了数组长度,他就无法处理这种情况,所以通常我们价将数组长度设置的非常大。因为数组很大,但是如果我们输入的数据元素很少,这样就极大的浪费内存空间。最重要的是
如果
我们输入的元素超出了数组长度,有些编译器不会报错,他会把数组存满,剩余的元素不再存取,这样会使程序输出一个错误的值。
所以有时我们要使用动态内存。
“动态内存分配”主要是为了解决那些在运行时才知道所需内存空间 的数组的内存分配。
首先我们来了解malloc,free,calloa,realloc这四个函数:
"malloc",函数原型 void *malloc(size_t size);
"calloc",函数原型void *calloc(size_t num elements,size_t
element_size )
"realloc"函数原型 void *realloc(void *ptr,size_t new_size)
"free"函数原型 free(p);
free的参数必须是NULL,或者是malloc,calloc,realloc的返回值。
他的作用是释放内存(用完内存后必须释放,不然会发生内存泄漏,内存越用越少)。当然,当你释放完后p依然指向内存的起始位置,所以还要手动将地址p赋为空,即:p=NULL。
使用free时一定要确保不再访问被释放内存的地址。
动态内存使用的常见错误:
1、没有检查内存是否匹配成功
2、操作内存时越界
例如:申请一个数组arr[3],如果数组引用时下标小于0或者下标大于2会发生越界。
3、使用free释放内存后,任然访问被释放内存的地址。