美文网首页
动态内存分配

动态内存分配

作者: Mustard_Buli | 来源:发表于2016-03-01 21:01 被阅读98次

自动分配内存:当定义以基本类型的变量的时候,系统会地方为这个变量自动分配内存,这个 内存在堆上。当作用域结束,系统会自动将这个内存回收。
  动态分配内存:开发人员自己向系统申请的内存空间,申请的内存位于栈上,当作用于结 束之后,系统是不会自动收回内存的。这个内存必须由开发人员自己去释 放。如果不释放,就内存泄露了。用“free(void *)这个函数进行释放,这里值得注意的是free的参数必须为指针,并且是动态内存分配的。


△什么时候需要动态分配内存?
  程序运行过程中,需要保存/记录相应的数据,但是又没有提前准备好内存,那么就需要临时动态分配内存。

△使用函数:
  void *malloc(size_t);
  size_t: 希望申请的内存空间(字节byte)
  void * :系统一开始不知道你需要存放什么数据,不同的数据需要的内存空间不一样,所以默认就是给一个void *,泛指所有指针类型(char *, int *, struct *),当在使用的时候必须将void *转化为相应的类型。如果没有申请成功,那么返回值为NULL。
      所以每次申请内从空间之后都要检验是否成功开辟内存空间。
△计算结构体内存空间
原理:如果结构体内部拥有多种数据类型,那么以占据内存字节数最高的类型对齐

typedef struct{
    char *name;
    int age;
}Person;//16
char * 占据8个字节, int 占据4个字节
所以age变量自动向name对齐。整个占据16个字节
 
typedef struct{
    char name;
    int age;
}Person;//8
 
typedef struct{
    char name[2];
    int age;
}Person;//8
 
typedef struct{
    char name[6];
    int age;
}Person;//12

P.S.①指针变量默认都要赋初值,如果没有则为NULL,这是因为防止野指针的出现。
  ②函数中尽量不要返回指针。

动态内存分配realloc
  具体函数:void *realloc(void *, size_t)  其中,第一个『void *』是指返回重新分配的内存空间的首地址;第二个『void *』指针只想的内存区域必须是malloc分配过的;『现在总共需要多少内存空间』。这里需要注意的是,如果realloc没有获取到内存空间,那么必须对之前的内存进行释放。

 #include <stdio.h> 
 #include <stdlib.h>   
 int main(int argc, const char * argv[]) { 
  
 char *name = NULL; 
 char temp; 
 int total = 0; 
 
 while (1) {
 //从终端获取一个字符
 temp = getchar();
 
 //判断这个字符是不是回车键\n
 if (temp == '\n') {
 break;
 } else{
 //为这个字符添加一篇内存空间
 //判断是不是第一次分配内存空间
 if (name == NULL) {
 //第一次
 name = (char *)malloc(1 * sizeof(char));
 if (name == NULL) {
  exit(EXIT_FAILURE);
  }
 } else{
 //不是第一次,需要在之前的内存空间里面添加 一个字符的空间
 char *pTemp = NULL;
 pTemp = (char *)realloc(name, (total+1)*sizeof(char));
 if (pTemp == NULL) {
 //释放掉之前的内存空间
 free(name);
  exit(EXIT_FAILURE);
  }
 
 name = pTemp;
  }
 //保存这个字符
 *(name + total) = temp;
 
 total++;
  }
 
  }
 
 printf("%s\n", name);
 
 free(name);
 return 0;
 }

相关文章

网友评论

      本文标题:动态内存分配

      本文链接:https://www.haomeiwen.com/subject/qnqnkttx.html