void * 无类型的通用地址
int arr[10];静态数组,在栈(1MB)中存放,怎么自定义VS栈的大小
静态数组存在的缺陷:1、不能根据变量动态申请内存
2、并且不能申请大块内存,
动态内存:
1、动态内存有什么用?
可以根据变量n动态申请数组
2、怎么使用动态内存
2.1 malloc,
从堆内申请动态内存,也有可能申请失败,如果申请所需的内存不够或者够但不连续,返回NULL,堆大小>1.8G
头文件#include
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);//调用上述函数 }
结果:
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)