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开辟内存未赋值下的值乱七八糟。