动态内存分配

一、存储区划分

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

栈内存

//凡是在函数体内定义的变量 都存储在栈区(包括形参)。
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. java.lang.ThreadGroup.enumerate

    java.lang.ThreadGroup.enumerate(Thread[] list) 方法复制该线程组及其子组中的所有活动线程到指定的数组. 声明 以下是java.lang.ThreadGro ...

  2. g++默认支持c++11标准的办法

    //第一种,直接包含在源程序文件中,如第一行代码所示 #pragma GCC diagnostic error "-std=c++11" #include <iostream ...

  3. ROS语音识别

    一.语音识别包 1.安装         安装很简单,直接使用ubuntu命令即可,首先安装依赖库: $ sudo apt-get install gstreamer0.10-pocketsphinx ...

  4. jsoup Cookbook(中文版)--爬虫(java)

    转载:http://www.open-open.com/jsoup/ 目录: 入门 解析和遍历一个html文档 输入 解析一个html字符串 解析一个body片断 根据一个url加载Document对 ...

  5. 2、IValueConverter应用

    1.C#代码如下: public class logotoimgConverter:IValueConverter { //将logo转换为URI public object Convert(obje ...

  6. auto_ptr的使用原则

    auto_ptr是c++标准库中的一种严格所有权型的智能指针,实现在backward/auto_ptr.h文件中 pro: 1.做临时变量时,不需要手动去释放资源 void f() { ClassA ...

  7. C语言与MATLAB接口 编程与实例 李传军编着

    罗列一下以前自己学习C语言与MATLAB混编的笔记,顺便复习一遍. <C语言与MATLAB接口 编程与实例 李传军编着>(未看完,目前看到P106) 目录P4-8 ************ ...

  8. VMWare三种工作模式 :bridge、host-only、nat

    VMWare提供了三种工作模式,它们是bridged(桥接模式).NAT(网络地址转换模式)和host-only(主机模式).要想在网络管理和维护中合理应用它们,你就应该先了解一下这三种工作模式.这里 ...

  9. 免费获得NOD32 半年、1年 激活码-14.08.12到期

    地址: http://nod32.ruanmei.com/ 活动时间: 2014年8月6日 - 8月12日(全部送完将提前终止). 活动规则: 1.每台电脑限领1枚NOD32激活码: 2.领到的NOD ...

  10. jQuery 元素遍历

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...