动态内存分配

一、存储区划分

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

栈内存

//凡是在函数体内定义的变量 都存储在栈区(包括形参)。
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. [Js]滑动门效果

    描述:鼠标移动到一副图片上,会显示该副图片的全貌,而其他图片会显示概貌 一.没有动画效果的运动 思路: 1.定好每张图片的初始位置(第一张完全显示,234只露出一部分) 2.计算每道门的移动距离(即未 ...

  2. u-boot 之配置分析 (2)

    Makefile简要分析所有这些目录的编译连接都是由顶层目录的makefile来确定的. 1.在makefile中有: unconfig: @rm -f $(obj)include/config.h ...

  3. 8种主要排序算法的C#实现

    作者:胖鸟低飞 出处:http://www.cnblogs.com/fatbird/ 简介 排序算法是我们编程中遇到的最多的算法.目前主流的算法有8种. 平均时间复杂度从高到低依次是: 冒泡排序(o( ...

  4. HDU 5382 莫比乌斯反演

    题目大意: 求S(n)的值 n<=1000000 这是官方题解给出的推导过程,orz,按这上面说的来写,就不难了 这里需要思考的就是G(n)这个如何利用积性函数的性质线性筛出来 作为一个质数,那 ...

  5. vim配置及插件安装管理(超级详细)

    1 写在前面   Linux下编程一直被诟病的一点是: 没有一个好用的IDE, 但是听说Linux牛人, 黑客之类的也都不用IDE. 但是对我等从Windows平台转移过来的Coder来说, 一个好用 ...

  6. 启动BPM的5个步骤

    在大部分业务中,我们通常认为:一个主要的业务流程管理项目从设计时间开始会比较好.我们知道很多方式来提高效率,增加生产力以及简化我们员工的工 作 - 这正是业务流程管理所做的.不幸的是,不管我们意图多好 ...

  7. (转)Ratchet教程:创建项目

    原文:http://www.w3cplus.com/mobile/how-to-create-mobile-project-width-ratchet.html Ratchet教程:创建项目      ...

  8. ios工程中ARC与非ARC的混合

    ARC与非ARC在一个项目中同时使用, 1,选择项目中的Targets,选中你所要操作的Target,2,选Build Phases,在其中Complie Sources中选择需要ARC的文件双击,并 ...

  9. 【LeetCode OJ】Palindrome Partitioning II

    Problem Link: http://oj.leetcode.com/problems/palindrome-partitioning-ii/ We solve this problem by u ...

  10. iOS APP上线流程

    前言:作为一名IOS开发者,把开发出来的App上传到App Store是必须的.下面就来详细介绍下具体流程. 1.打开苹果开发者中心:https://developer.apple.com 打开后点击 ...