C语言基础_函数

一、程序存储区划分

     1、栈区
     1)局部变量  函数 循环 分支 都存储在栈区
     2)当函数 循环 分支中的局部变量生命周期结束之后(执行结束) 系统销毁并回收存储空间
     3)函数返回值返回栈区的内存是不安全的

  2、常量区内存
     1)常量存储在常量区 数字 字符 字符串等
     2)常量区的存储空间也是系统分配和回收的
     3)程序运行结束的时候 回收存储空间
     4)常量区的数据只能访问 不能修改 修改必崩

     char *p = "hello";//在常量区
     p[0] = 'i';//修改是错误的
      char a1[] ="nihao";//数组操作的字符是在栈区的副本
      a1[1] = 'N';

  3、静态区

      1)全局变量 使用static修饰的局部变量 都存在静态区
      2)静态区的内存由系统分配和回收
      3)程序运行结束之后 静态区的内存被回收 他的生命周期和程序一样长
      4)静态变量如果没有初始值 默认为0
      5)在编译时初始化 运行期间可以修改

  4、代码区

    1)由系统分配和回收
      2)程序运行结束之后由系统收回分配的存储空间
      3)只能读取不能修改

  5、堆区

  1)由ios开发工程师负责分配和回收
      2)忘记回收会造成内存泄露
      3)程序运行结束之后回收堆内存 如果不能及时回收堆内存 程序运行期间可能会因为内存泄露造成堆区内存被全部占用 程序不能运行

二、动态申请内存

void * malloc(size_t);
//void * : 表示无类型的指针 可以转换成任意类型的指针
 //作用 在堆区开辟指定 size_t 个字节的空间 并把空间的首地址返回
  int *p = NULL;
  p = malloc(4);//int *p = malloc(sizeof(int));
  *p = 10; //存储在堆区
    
  float *p1 = malloc(sizeof(float));//开辟指定大小的堆内存 返回空间的首地址
  *p1 = 3.55;

  1)在堆区开辟一个char类型的数组 有8个字符

 char *p2 = malloc(sizeof(char)*8);
  //使用p2将字符串拷贝到内存中
  strcpy(p2, "ios");

  2)分配一个整形数组的内存 10个随机元素[30,60]

   int *p3 = malloc(sizeof(int)*10);
   for (int i =0; i<10; i++) {
        *(p3+i) = arc4random() % 31 +30;
        printf("%d ",*(p3+i));
    }

  3)开辟一个结构体内存 存入堆区

typedef struct student{
    char name[20];
    int age;
    float score;
}Student;
int main(int argc, const char * argv[]) {
      Student *s = malloc(sizeof(Student));
      strcpy(s->name, "ios");
      s->age = 18;
      s->score = 90;
      printf("\n%s %d %f",s->name,s->age,s->score);
  return 0;  
}

  4)有一个字符串,其中有数字,提取其中的数字要求动态分配内存[先计算出几个数字,然后根据数字的个数开辟空间]

    char str[] = "qwer123456df";
    int count = 0;
   for (int i = 0; i<strlen(str); i++) {
        if (str[i] >= '0' && str[i] <= '9') {
            count++;
        }
    }
    printf("%d\n",count);
    int *p = malloc(sizeof(int)*count);
    count = 0 ;
    for (int i =0 ; i<strlen(str); i++) {
        if (str[i] >= '0' && str[i] <= '9') {
            int res = 0;
            res = str[i]-'0';//字符转化成数字
            *(p+count) = res;//存入堆区
            count++;
        }
    }
    for (int i = 0; i<count; i++) {
        printf("%d ",*(p+i));
    }
    //释放堆区内存
    free(p);
    p = NULL;//指针为空 避免野指针

  5)输入三个学员的姓名,动态分配内存,保存学员的姓名,并最后输出[将数组name 保存成指针 指针指向堆区]

 char *name[3]={0};
    char temp[40] = {0};//中间数组
    printf("请输入3个姓名:\n");
    for (int i = 0; i < 3; i++) {
        scanf("%s",temp);
        getchar();
        name[i] = malloc(sizeof(temp)+1);
        strcpy(name[i], temp);
    }
    for (int i=0; i<3; i++) {
        printf("%s ",name[i]);
    }
    for (int i =0; i<3; i++) {
        free(name[i]);
        name[i]  =NULL;
    }

 

posted @ 2015-08-10 19:34  哈哈政  阅读(208)  评论(0)    收藏  举报