void * 无类型的通用地址
int arr[10];静态数组,在栈(1MB)中存放,怎么自定义VS栈的大小
静态数组存在的缺陷:1、不能根据变量动态申请内存
2、并且不能申请大块内存,
动态内存:
1、动态内存有什么用?
可以根据变量n动态申请数组
2、怎么使用动态内存
2.1 malloc,
从堆内申请动态内存,也有可能申请失败,如果申请所需的内存不够或者够但不连续,返回NULL,堆大小>1.8G
头文件#include <malloc.h>//大小的单位是字节
int *p=(int*)malloc(n * sizeof(int));//x*y,x代表申请空间个数,y代表每个格子大小,用int 类型的指针接收,左边需要强转int*
2.2 calloc
在malloc的基础上,将初始值全部变成0
int *p=(int*)calloc(n , sizeof(int));
2.3 realloc(重新分配内存块)
int *p=(int*)realloc(n , sizeof(int));
int main()
{
int n = 10;
int* p = (int*)malloc(n * sizeof(int));
//突然扩大内存,扩大为2倍
int *p=(int*) realloc(p,n * sizeof(int) * 2);//等号右边参数p,表示指向原先空间,等号左边再用*p接收,也要强转
}
3、怎么释放动态内存
realloc 扩大内存的时候,相当于释放了之前的内存,重新开辟一个较大的内存空间。
4、注意事项
(1)malloc强转的时候,前面的强转和后面的sizeo内的类型不一致,sizeof里面没有*;
(1)calloc注意,两个参数不要写反;
(3)realloc注意:第一个参数需要填写原先内存的开头地址;
第二个参数是需要的重新开辟的总字节数,不是需要在原先内存的基础上扩充的字节数。
4、动态内存的申请
int main()
{
//动态申请整型空间10个
int* p = (int*)malloc(10 * sizeof(int));
//扩充两倍
int* p=(int*)realloc(p,10 * sizeof(int)*2);
//动态申请字符空间20个
char* q = (char*)malloc(20 * sizeof(char));
//扩充两倍
char* p=(char*)realloc(p,20 * sizeof(char)*2);
//动态申请double空间100个
double* m = (double*)malloc(100 * sizeof(double));
//扩充两倍
double* p=(double*)realloc(p,100* sizeof(double)*2);
}
5、筛选法选素数,利用动态内存
筛选法:0,1,2,3,4,5,6,7,8,9 一维数组的值
0,1,2,3,4,5,6,7,8,9 一维数组的下标(此出假设下标和其指向空间的值相等)
从2开始,判断3~9模2是是否等于0,等于的话将此值剔除,即下面代码中p[j]=0;
从3开始,判断值不为0的数模3是是否等于0,等于的话将此值剔除,即下面代码中p[j]=0;
。。。。。
代码:
//筛选法选素数,
void fun(int n)
{
int *p=(int*)malloc(n * sizeof(int));//x*y,x代表申请空间个数,y代表每个格子大小,用int 类型的指针接收,左边需要强转int*
assert(p != NULL);//断言,判断是否申请成功
for (int i = 0; i < n; i++)
{
p[i] = 1;//标号,给定初始值为1
}
p[0] = p[1] = 0;//p存储的值就是它的下标
for (int i = 2; i < n; i++)//从第2个下表开始访问一维数组
{
for (int j = i + 1; j < n; j++)//j从i的下一数开始判断
{i
if (p[j] != 0 && j % i == 0)//如果j下标存储的值不为0,且值模i等于0,则将此值赋值为0,0代表此出的值将不会再被检索
{
p[j] = 0;
}
}
}
for (int i = 0; i < n; i++)//从数组的0号下标开始遍历,找到下标对应的空间值不为0的位置,打印值
{
if (p[i]!= 0)
{
printf("%d ", i);
}
}
}
int main()
{
fun(10);//调用上述函数
}
结果: