动态内存分配

一、存储区划分

从低到高(内存地址小----内存地址大)  :  代码区---常量区---静态区---堆区---栈区

栈内存

//凡是在函数体内定义的变量 都存储在栈区(包括形参)。
int a = ;//a也是在栈区域里面
float b = 1.5;//b也是在栈区域里面
char c = 'b';
double d = 3.14;
printf("%p %p %p %p\n",&a,&b,&c,&d);
//栈的特点先进后出,先定义的变量先入栈,后定义的变量后入栈。
//调用函数时。函数中得变量会陆续入栈,函数调用结束时,变量陆续出栈
//栈区内存的分配与回收,有系统自动进行。

常量区

‘a’字符常量     5整型常量       “iphone” 字符串常量

常量占用内存 只读状态   不能修改

静态存储区

static int a = 5;

1.只初始化一次    2.如果初始没给值,默认为0   3.只有程序退出才释放(永远存在)

将变量定义的类型前加static  则该变量存储在静态存储区

    //编译期就已经进入内存,程序运行期间h一直存在,不会被销毁  ,程序结束时h才会被销毁,如果没有给h赋值,h默认初始值为0
static int h = ;
#import <Foundation/Foundation.h>

int m = ;
//定义在函数外面的变量称为全局变量,全局变量跟静态变量一样,存储在全局区(也叫静态区)
int main(int argc, const char * argv[])
{

二、堆内存分配函数

堆内存 一般由程序员分配和释放

malloc: void *malloc(unsigned int size);//void * 表示任意类型的指针

int * p = (int *)malloc(sizeof(int) * n);//(int *)强转类型  sizeof(int)分配的内存大小 *n元素个数

char *str = malloc(8);

    //malloc主要功能是从 堆区 开辟 指定大小 得内存空间
//内存大小以 字节 为单位
//返回值是这段空间的首位置
//我们需要定义一个指针保存返回值
int *p = malloc();
//p在栈区。malloc操作的十堆区,p存的地址是堆区地址
int a = ;
int *q = &a;
//a在栈区,q也在栈区,q存的a的地址,也就是栈区地址

strcpy(str, ”iPhone”);

free(str);//标记删除,不清除内容

    struct student{
char name[];
int age;
int num;
char sex; };
typedef struct student Student;
Student *pstu = malloc(sizeof(Student)*);
pstu->age = ;
free(pstu);//释放内存,160个字节归还给系统

Student *p = malloc(sizeof(Student));//分配的内存大小要用 sizeof(Student)

void * calloc(unsigned n,unsigned size);//n内存个数 size大小    calloc 清空内存

//分配n个size大小的空间,并且把该内存上的所有字节清零

void *realloc(void *p,unsigned newSize);//按新的长度重新分配

void *memset(void *s , int c , size_t n);//memset(p , 0 , sizeof(int) * 5)  通常用于清除结构体或者数组数据

    //输入三个学员的姓名,动态分配内存保存学院姓名,并最后输出
//定义一个包含3个字符指针的数组,他们默认指向null(0)
char *names[]={};
//定义一个临时数组,用于存放输入的单个单词
char temp[] = {};
for (int i = ; i<; i++) {
scanf("%s",temp);//temp前面不要加&,因为数组名本身就是地址
//获取单个单词的长度
unsigned long length = strlen(temp);
//让指针指向开辟的堆空间
names[i] = malloc(length+);
//将输入的内容拷贝到堆空间里
strcpy(names[i], temp);
}
for (int i = ; i<; i++) {
printf("%lu %s\n",strlen(names[i]),names[i]);
free(names[i]);
}

void *memcpy(void *dest,const void *source,size_t n)

iOS学习笔记---c语言第十天的更多相关文章

  1. iOS学习笔记---oc语言第十天

    内存管理高级 一 属性的内部实现原理   assign   retain    copy assign 下的属性内部实现 setter方法 @property(nonatomic,assign)NSS ...

  2. IOS学习笔记07---C语言函数-printf函数

    IOS学习笔记07---C语言函数-printf函数 0 7.C语言5-printf函数 ------------------------- ----------------------------- ...

  3. IOS学习笔记06---C语言函数

    IOS学习笔记06---C语言函数 --------------------------------------------  qq交流群:创梦技术交流群:251572072              ...

  4. iOS学习笔记---oc语言第一天

    第一讲 初始类和对象 c语言的超集,允许在oc中使用c语言源代码.编译器兼容c语言程序 具备完善的面向对象特性 包含一个运行时系统 类库丰富 面向对象编程 oop 面向对象语言:c++  java   ...

  5. iOS学习笔记---c语言第八天

    指针 首先将变量a的地址存放在另一个变量中,比如存放在变量b中,然后通过变量b来间接引用变量a,间接读写变量a的值.用来存放变量地址的变量,就称为"指针变量" int *p=nul ...

  6. iOS学习笔记---oc语言第九天

    初级内存管理 iOS应用程序出现crash(闪退),90%以上是内存问题////其他:数组越界,方法只声明没实现 内存问题体现在两个方面:内存溢出\野指针异常 内存溢出:程序运行超出内存上限 野指针异 ...

  7. iOS学习笔记---oc语言第六天

    Block .数组高级 block本质上就是匿名函数(没有名称的函数) block语法和函数指针很相似 回顾函数 函数:C语⾔中,实现某一类功能的代码段. 完整的函数包含两部分:函数声明.函数定义 函 ...

  8. iOS学习笔记---oc语言第五天

    字典,数组 ,集排序 一.字典类 存储以下数据 name:张三; sex:男;age:18 film:风暴; playcount:10000次;price:60元 字典类用于保存具有映射关系(key- ...

  9. iOS学习笔记---oc语言第四天

    字符串 数组 一.使用苹果帮助文档 学会使⽤用苹果帮助⽂文档是开发者的⼀一项技能 Inherits from 继承⾃自 Conforms to 遵循什么协议 Framework 属于哪个框架 Avai ...

随机推荐

  1. linux下不能使用shutdown命令

    命令查看:  #echo $PATH     /usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/usr/sbin;/ ...

  2. Junit4的简单使用

    junit4的简单使用 测试套件的使用 测试类1 package com.westward; import static org.junit.Assert.*; import org.junit.Te ...

  3. uva 1210

    #include<iostream> #include<cstring> using namespace std; + ; bool notprime[MAXN];//值为fa ...

  4. call,apply,bind函数

    一.call函数 a.call(b); 简单的理解:把a对象的方法应用到b对象上(a里如果有this,会指向b) call()的用法:用在函数上面 var Dog=function(){ this.n ...

  5. mouseleave 与 mouseout 的不同

    Q:给某div添加mouseout事件后,在空白区域移动到其子元素(如按钮)上(此时并没有离开此div)时,会触发mouseout事件,而mouseleave则不会 A:与 mouseout 事件不同 ...

  6. Oracle异常处理内容,隐式游标

    异常处理 create or replace procedure pr_test3(v_bh in varchar2,v_xx out t_hq_ryxx%rowtype) is begin sele ...

  7. 关于Android的onResume的2点体会(程序切换之后恢复状态)

    Android有点儿差劲:按home键之后,立即长按home键选择程序切换回来,居然activity就跑回初始状态去了. 我的程序里面有2个webview,2个按钮,我做到把他们都恢复了. 1 web ...

  8. C语言中 scanf 和 printf 的小要点

    1 scanf_s需指定%c 个数 h short l long关键字 * 不赋给任何值 W 指定读入宽度 转换字符 a 读浮点值(c99) A 读浮点值(c99) c 读单字符 d 读十进制数 i ...

  9. Linux中如何让命令在后台运行

    1.在下达的命令后面加上&,就可以使该命令在后台进行工作,这样做最大的好处就是不怕被ctrl+c这个中断指令所中断. 2. 那大家可能又要问了,在后台执行的程序怎么使它恢复到前台来运行呢?很简 ...

  10. ubuntu 防火墙 添加策略 解决mysql远程访问问题

    ubuntu 的iptables 文件不在 init.d中 不能 service iptables restart 只修改 /etc/iptables 文件也不管用 sudo iptables -L ...