malloc分配内存
用法
- 参数为要开辟内存的大小(字节为单位)
- 返回值为
void*
,所以要强转一下 - 语法:
malloc()
- 动态开辟20个字节的内存,代码:
#include <iostream>using namespace std;int main() {int *a = (int *) malloc(sizeof(int) * 5);a[0] = 111;a[1] = 222;a[2] = 333;a[3] = 444;a[4] = 555;for (int i = 0; i < 5; i++)cout << a[i] << endl;return 0; }
开辟完内存不赋值里面的值
-
如果用malloc开辟完内存不初始化值,里面的值就会是乱七八糟的。
#include <iostream>using namespace std;int main() {int *a = (int *) malloc(5 * sizeof(int));if (a == nullptr) {cout << "内存分配失败!" << endl;} else {cout << a[0] << endl;cout << a[1] << endl;cout << a[2] << endl;cout << a[3] << endl;cout << a[4] << endl;}return 0; }
内存开辟失败
- 如果内存开辟失败则返回0
- c++中的
nullptr
来判断一个指针是不是空指针,但是在c中不能用,在c中只能判断是不是0#include <iostream>using namespace std;int main() {int *a = (int *) malloc(sizeof(int) * 9999999999999999999);cout << a << endl;if (a == nullptr) {cout << "内存开辟失败!" << endl;}return 0; }
使用完清空内存
free()
方法清空分配的内存#include <iostream>using namespace std;int main() {int *a = (int *) malloc(sizeof(int) * 1);if (a == nullptr) {cout << "内存开辟失败!" << endl;} else {*a = 200;cout << "开辟的内存地址:" << a << endl;cout << "a的值:" << *a << endl;free(a);cout << "清空内存后a的值:" << *a << endl;}return 0; }
calloc分配内存
用法和清空内存
-
返回值、清空内存和判断是否空指针用法和malloc一样
-
语法:
calloc(开辟内存的个数,单个的大小)
#include <iostream>using namespace std;int main() {int *a = (int *) calloc(10, sizeof(int));if (a == nullptr) {cout << "内存分配失败!" << endl;} else {*a = 200;cout << *a << endl;free(a);cout << *a << endl;}return 0; }
开辟完内存不初始化和malloc不同
-
都初始化为了0
#include <iostream>using namespace std;int main() {int *a = (int *) calloc(10, sizeof(int));if (a == nullptr) {cout << "内存分配失败!" << endl;} else {cout << a[0] << endl;cout << a[1] << endl;cout << a[2] << endl;}return 0; }
realloc重新分配内存
用法和清空内存
-
返回值、清空内存用法和malloc一样
-
开辟出的内存不赋值类似于malloc,值都是乱七八糟的
-
重新分配内存空间时,之前指针里面的值不会变,相当于把之前指针中德内容复制过来了。
realloc(原内存地址,重新分配的大小(单位为字节))
-
重新分配后,原指针首地址可能会变可能不会变
#include <iostream>using namespace std;int main() {int *a = (int *) calloc(5, sizeof(int));if (a == nullptr) {cout << "内存分配失败!" << endl;} else {a[0] = 111;cout << "未重新分配时a的地址:" << &a[0] << endl;a = (int *) realloc(a, 10 * sizeof(int));cout << "重新分配时a的地址:" << &a[0] << endl;cout << a[0] << endl;}return 0; }
new 关键字分配内存
用法
-
清空内存使用
delete 指针
如果是数组使用delete[] 指针
-
开辟内存后不初始化和malloc一样,值乱七八糟
#include <iostream>using namespace std;int main() {int *a = new int[5];cout << a << endl;a[0] = 11;a[1] = 22;a[2] = 33;a[3] = 44;a[4] = 55;for (int i = 0; i < 5; i++) {cout << a[i] << endl;}delete[] a;cout << a[1] << endl;return 0; }
内存分配失败时抛出一个异常
memcpy复制内存
用法
- 可以全部复制也可以复制一部分
memcpy(要复制到哪的内存地址,复制的内存地址,要复制的长度)
#include <iostream>using namespace std;int main() {bool flag = false;int *p_a = new int[5];int *p_b = new int[10];p_a[0] = 11;p_a[1] = 22;p_a[2] = 33;p_a[3] = 44;p_a[4] = 55;memcpy(p_b, p_a, 5 * sizeof(int));cout << p_b << endl;for (int i = 0; i < 10; i++) {if (i > 4 and !flag) {cout << "---------" << endl;flag = true;}cout << p_b[i] << endl;}return 0;
}
- 展示一下new int开辟内存未赋值下的值乱七八糟。