malloc动态开辟内存空间
*函数声明:void malloc(unsigned size);
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//malloc 动态开辟内存空间
int main() {
char buf[20] = "welcome to xian";
char* name;
name = (char*)malloc(sizeof(char) * 20);
strcpy(name, buf);
printf("%s\n", name);
free(name);
if (name != NULL) {
name = NULL;
}
return 0;
}
calloc动态开辟内存空间
函数声明:void calloc (size_t num, size_t size);*
//calloc动态开辟内存空间
int main() {
int* p;
p = (int*)calloc(10, 4);
for (int i = 0; i < 10; ++i) {
p[i] = 2 * i + 1;
printf("p[%d]=%d\n", i, p[i]);
}
free(p);
if (p != NULL) {
p = NULL;
}
return 0;
}
realloc动态开辟内存空间
函数声明:void * realloc ( void * ptr, size_t new_size );
1.ptr必须为NULL,或者为malloc,realloc或者calloc的返回值,否则发生realloc invalid pointer错误
2.new_size如果小于old_size,只有new_size大小的数据会被保存,可能会发生数据丢失,慎重使用。
3.如果new_size大于old_size,可能会分配一块新的内存,这时候ptr指向的内存会被释放,ptr成为野指针,再访问的时候会发生错误。
4.最后不要将返回结果再赋值给ptr,即ptr=realloc(ptr,new_size)是不建议使用的,因为如果内存分配失败,ptr会变为NULL,如果之前没有将ptr所在地址赋给其他值的话,会发生无法访问旧内存空间的情况,所以建议使用temp=realloc(ptr,new_size)。
//realloc重新规定分配的内存
int main() {
char*p = (char*)malloc(sizeof(char) * 2);
strcpy(p, "p");
//realloc参数中的指针必须是malloc,calloc,realloc的返回值
//如果realloc分配的内存大小大于旧指针大小,则重新分配新内存,
//旧的指针自动释放,成为野指针,后续操作野指针属于非法操作
char* p2=realloc(p, sizeof(char) * 30);
//条件判定一下,如果分配失败直接返回
if (p2 == NULL) {
printf("动态内存分配失败\n");
return -1;
}
strcpy(p2, "welcome to xian!");
printf("%s\n", p2);
//free(p);//后续操作旧指针,属于非法操作
//p = NULL;
free(p2);
p2 = NULL;
return 0;
}