赞
踩
所以需要的动态分配内存空间。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int num = 10;
int* p = (int*)malloc(num);
if (NULL != p)
{
//使用空间
printf("%p\n", p); // 000002223EA7F370
}
free(p);
p = NULL;
return 0;
}
#include <stdio.h>
#include <stdlib.h>
int main()
{
int num = 10;
int* p = (int*)calloc(num, sizeof(int));
if (NULL != p)
{
//使用空间
printf("%p\n", p); // 000001B23D5C3810
}
free(p);
p = NULL;
return 0;
}
情况1:**原有空间之后有足够大的空间**
当是情况1 的时候,要扩展内存就直接**原有内存之后直接追加空间**,原来空间的数据不发生变化。
情况2:**原有空间之后没有足够大的空间**
当是情况2 的时候,原有空间之后没有足够多的空间时,扩展的方法是:**在堆空间上另找一个合适大小的连续空间来使用。**这样函数返回的是一个新的内存地址
void test()
{
int *p = (int *)malloc(INT_MAX/4);
*p = 20;//如果p的值是NULL,就会有问题
free(p);
}
void test()
{
int i = 0;
int* p = (int*)malloc(10 * sizeof(int));
if (NULL == p)
{
exit(0);
}
for (i = 0; i <= 10; i++)
{
*(p + i) = i;//当i是10的时候越界访问
}
free(p);
}
void test()
{
int a = 10;
int *p = &a;
free(p);//ok?
}
void test()
{
int *p = (int *)malloc(100);
p++;
free(p);//p不再指向动态内存的起始位置
}
void test()
{
int *p = (int *)malloc(100);
free(p);
free(p);//重复释放
}
忘记释放不再使用的动态开辟的空间会造成内存泄漏
void test()
{
int* p = (int*)malloc(100);
if (NULL != p)
{
*p = 20;
}
}
int main()
{
test();
while (1);
}
C99 中,结构中的最后一个元素允许是未知大小的数组,这就叫做**『柔性数组』**成员。
code示例:
typedef struct st_type
{
int i;
int a[0];//柔性数组成员
}type_a;
(1)结构中的柔性数组成员前面必须有至少一个其他成员。
(2)sizeof 返回的这种结构大小不包括柔性数组的内存。
(3)包含柔性数组成员的结构用malloc ()函数进行内存的动态分配,并且分配的内存应该大于结构的大小,以适应柔性数组的预期大小。
#include <stdio.h>
int main()
{
typedef struct st_type
{
int i;
int a[0];//柔性数组成员
}type_a;
printf("%d\n", sizeof(type_a)); // 4
return 0;
}
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> typedef struct st_type { int i; int a[0];//柔性数组成员 }type_a; int main() { printf("%d\n", sizeof(type_a)); // 4 int i = 0; type_a* p = (type_a*)malloc(sizeof(type_a) + 100 * sizeof(int)); //业务处理 p->i = 100; for (i = 0; i < 100; i++) { p->a[i] = i; } // 这样柔性数组成员a,相当于获得了100个整型元素的连续空间。 free(p); return 0; }
结构体的内存以及其成员要的内存一次性分配好了,并返回给用户一个结构体指针,用户做一次free就可以把所有的内存也给释放掉。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。