动态内存管理
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
int main()
{
int* p = (int*)malloc(40);
int i = 0;
if(p == NULL)
{
printf("%s\n", strerror(errno));
return 0;
}
for(i=0; i<10; i++)
{
*(p+i) = i;
}
for(i=0; i<10; i++)
{
printf("%d ", *(p+i));
}
free(p);
p = NULL;
return 0;
}
int main()
{
int arr[10] = {0};
int *p = arr;
free(p);
p = NULL;
return 0;
}
calloc(size_t num, size_t size): 开辟num个size字节长度的空间,并且初始化为0
calloc 比 malloc 多了个将开辟的每个字节初始化为0,而且开辟空间个数给定(num)
int main()
{
int*p = (int*)calloc(10, sizeof(int));
int i = 0;
int *ptr = NULL;
if(p == NULL)
{
printf("%s\n", strerror(errno));
return 0;
}
for(i=0; i<10; i++)
{
printf("%d ", p[i]);
}
ptr = realloc(p, 2000*sizeof(int));
if(ptr != NULL)
p = ptr;
free(p);
p = NULL;
return 0;
}
常见的动态内存错误:
void test()
{
int* p = (int*)malloc(10);
if(p == NULL)
{
return;
}
if(1)
return;
free(p);
p = NULL;
}
int main()
{
test();
getchar();
return 0;
}
错误一:对NULL指针的解引用
void test()
{
int *p = (int *)malloc(INT_MAX/4);
*p = 20;
free(p);
}
int main()
{
return 0;
}
错误二:对非动态开辟的内存使用free释放
void test()
{
int a = 10;
int *p = &a;
free(p);
}
int main()
{
test();
return 0;
}
错误三:对同一块动态内存多次释放(free)
int main()
{
int *p = (int *)malloc(40);
int i = 0;
if(p == NULL)
{
return;
}
for(i=0; i<5;i++)
{
printf("%d ", *(p+i));
}
free(p);
free(p);
p = NULL;
return 0;
}
错误四:对动态开辟的空间越界访问
void test()
{
int i = 0;
int* p = (int*)malloc(sizeof(int)* 10);
if (NULL == p)
{
exit(EXIT_FAILURE);
}
for (i = 0; i <= 10; i++)
{
*(p + i) = i;
}
free(p);
}
错误五:使用free释放一块动态内存的一部分(并不是完全释放)
void test()
{
int* p = (int*)malloc(100);
p++;
free(p);
}
错误六:忘记释放
void test()
{
int* p = (int*)malloc(100);
if (NULL == p)
{
*p = 20;
}
}
int main()
{
test();
while (1);
}
题目一:
void GetMemory(char *p)
{
p = (char *)malloc(100);
}
void Test(void)
{
char *str = NULL;
GetMemory(str);
strcpy(str, "hello world");
printf(str);
free(str);
str = NULL;
}
int main()
{
Test();
return 0;
}
修改-->传二级指针
void GetMemory(char **p)
{
*p = (char *)malloc(100);
}
void Test(void)
{
char *str = NULL;
GetMemory(&str);
strcpy(str, "hello world");
printf(str);
free(str);
str = NULL;
}
int main()
{
Test();
system("pause");
return 0;
}
题目二:
char *GetMemory(void)
{
char p[] = "hello world";
return p;
}
void Test(void)
{
char *str = NULL;
str = GetMemory();
printf(str);
}
int main()
{
Test();
return 0;
}
int* Test()
{
int a = 10;
return &a;
}
int main()
{
int *p = Test();
printf("hehe\n");
printf("%d\n", *p);
return 0;
}
int Test()
{
int a = 10;
return a;
}
int main()
{
int b = Test();
return 0;
}
题目三:
void GetMemory2(char **p, int num)
{
*p = (char *)malloc(num);
}
void Test(void)
{
char *str = NULL;
GetMemory2(&str, 100);
strcpy(str, "hello");
printf(str);
}
int main()
{
Test();
return 0;
}
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
题目四:
void Test(void)
{
char *str = (char *) malloc(100);
strcpy(str, "hello");
free(str);
if(str != NULL)
{
strcpy(str, "world");
printf(str);
}
}
int main()
{
Test();
return 0;
}
int main()
{
char *p = "abcdef";
*p = 'w';
return 0;
}
柔性数组:结构中的最后一个元素允许是位置大小的数组--即柔性数组
struct S
{
int a;
char arr[0];
};
struct B
{
int a;
char* arr;
};
void test2()
{
char *ptr = NULL;
struct B* ps = (struct B*)malloc(sizeof(struct B));
ps->arr = (char *)malloc(100*sizeof(char));
ps->a = 20;
strcpy(ps->arr, "abcdef");
printf("%s\n", ps->arr);
printf("%d\n", ps->a);
ptr = realloc(ps->arr, 200s*sizeof(char));
if(ptr != NULL)
ps->arr = ptr;
free(ps->arr);
ps->arr = NULL;
free(ps);
ps = NULL;
}
void test1()
{
struct S* ps = (struct S*)malloc(sizeof(struct S)+100*sizeof(char));
struct S* ptr = NULL;
ps->a = 20;
strcpy(ps->arr, "abcdef");
printf("%s\n", ps->arr);
printf("%d\n", ps->a);
ptr = realloc(ps, sizeof(struct S)+200*sizeof(char));
if(ptr != NULL)
ps = ptr;
free(ps);
ps = NULL;
}
int main()
{
test2();
return 0;
}