malloc
free
示例
int i = 10;
int *p = (int *)malloc(sizeof(int)) // 在堆中分配一个整数大小的内存.
printf("%p, %d\n", &i, i);
printf("%p, %d\n", p, *p);
free(p); // 必须要手动释放堆内存.
特殊示例:
int main()
{
char *s = null;
test(s);
print("%s\n", s);
}
void test(char *p)
{
p = malloc(sizeof(char) * 10);
strcpy(p, "hello");
}
打印结果:null
原因:
s指针指向的是空地址->空地址赋值给p->p指向了一个新的堆地址->p进行字符串赋值->
s还是指向的空地址->打印字符串s结果为null
int main()
{
char *s = malloc(sizeof(char) * 10);
test(s);
print("%s\n", s);
}
void test(char *p)
{
strcpy(p, "hello");
}
打印结果:hello
int main()
{
char *s = null;
test(&s);
print("%s\n", s);
}
void test(char **p)
{
*p = malloc(sizeof(char) * 10);
strcpy(*p, "hello");
}
打印结果:hello
解析:
s指向了空地址->s将自己的地址传递给p->*p申请堆空间(s的值也就指向了堆空间)->
*p赋值(相当于s进行字符串赋值)->输出字符串
calloc
calloc(size, sizeof(int))
calloc(4, sizeof(int)) // calloc会将自动分配的内存清0
相当于:
malloc(4 * sizeof(int)) // 分配的内存不会清0
memset(p, 0, 4 * sizeof(p) // 手动清0
int i[10] = {0};
memset(i, 0, sizeof(i)) // 分配的数组内存清0
实现动态分配内存:
#include <stdio.h>
#include <string.h>
#include<stdlib.h>
void init_array(char *s);
void add_array(char *s);
char *array = NULL;
int main(int argc, char *argv[])
{
init_array("hello");
add_array(argv[1]);
printf("%s\n", array);
free(array);
return 0;
}
void init_array(char *s)
{
// 初始化之前必须要释放.
free(array);
if (s != NULL) {
array = malloc(strlen(s) * sizeof(char) + 1);
strcpy(array, s);
}
}
void add_array(char *s)
{
if (array == NULL) {
init_array(s);
} else {
int lenArr = strlen(array);
int lenS = strlen(s);
char *temp = malloc((lenArr + lenS) * sizeof(char) + 1);
temp[lenArr + lenS] = 0;
for (int i = 0; i < lenArr; i++) {
temp[i] = array[i];
}
for (int i = 0; i < lenS; i++) {
temp[lenArr + i] = s[i];
}
free(array);
array = temp;
}
}
realloc()
重新分配内存地址
array = realloc(array, a+b+1)
void add_arrary_new(char *s)
{
if (s == NULL)
return ;
if (array) {
int a = strlen(array);
int b = strlen(s);
// 重新分配内大小.
array = realloc(array, a + b + 1);
memset(array + a, 0, b + 1)
strcpy(&array[a], s);
}
}