动态内存相关知识1


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);//调用上述函数
}

 结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值