栈区间:在函数内部声明的变量都存放在栈区间,比如int char 数组 结构体 指针,只管申请,系统会自动帮我们回收,收回的时间是作用域结束之后,遵循的原则是"先进后出"。

int a = 10;

const int m =10;

printf("%p\n", &m);

printf("%p\n", &a);

堆区间:在五大区间中占用比例较大的区间,需要手动申请和手动释放,遵循的原则 "先进先出",堆区间空间的开辟是无序的,并且没有名字,所以我们需要一个栈区的指针来指向堆内存的数值。

int *b = malloc(sizeof(int ) *2);

printf("%p\n",b);

free(b);

静态区:定义在函数体外面的变量。存放全局变量或者静态变量,生命周期很长,一般到程序结束才释放,使用static修饰的变量,只初始化一次,默认值为0

static int c= 23;

printf("%p\n", &c);

void test3( ){

  static int a =10; 第一次调用函数就赋初值,后面在调用函数这个语句就不会在允许。

  a++;

  printf("%d\n",a);    //输出10,11,12

}

test3( );

test3( );

test3( );

常量区:我们平时遇到的常量都放到这里比如"myname",'c',87,87.4

printf("%p\n",&"hello world ");

常量区变量不能被修改:

char  *str ="iphone";    //字符指针指向常量区中字符串。

char str1[] ="iphone";    // 将常量区字符串拷贝到栈区的指针名称为str1的空间中。

str1[0] = 'I';        // 可以修改,不报错

str[0] = 'I';        //不报错,但是不能编译成功.程序崩溃

所以我们一般这样写:const char *str ="...." 这样写的好处就是在很大的项目中,我们在修改常量区变量的值的时候会报错,可以立即处理,而不是在编译运行之后报错,才从几万行代码中查找错误的源头。

代码区:一将源码编译成二进制文件,一般是函数。

void func( );

void func( ){

  printf(...)'  

}

printf("%p\n" , func );  //传入函数名称。

分配内存空间函数:

malloc 最后释放的时候不是真正的"清空",而是标记该空间已经使用完成,里面存放的值可能还存在。

char *str = malloc( sizeof(char) *30 );

printf("%p\n",str);

free(str);

free(str);  //不能重复的释放,会崩溃,因为已经没有对应指针名称的空间给你释放,为了安全起见,我们常常在free后面添加。

str = NULL;

calloc 开辟内存空间同时将里面的值清零。如果数据很大的话,效率很低。

char *str1 = calloc( sizeof(char) , 30);

printf("%p\n",str1);

free(str1);

str1 =NULL;

malloc与calloc两个分配内存空间的函数区别:

malloc是堆中分配1块长度为size的连续区域,返回它的首地址.

calloc 是堆中分配N块长度为size的联系区域,返回首地址.

realloc  根据给定的内存地址,重新开辟空间,一般都是开辟更大的空间。

int *num1 = malloc(sizeof(int ) * 10 );

realloc(num1,40);  //将10个字节的空间扩大到40个字节。

free(num1);

num1 = NULL;

memset 为刚开辟的空间赋初始值。

char  *str3 = malloc(sizeof(char) * 20);

memset(str3,'m',20);

free(str3);

str3 = NULL;

memcpy 拷贝

char *str4 = malloc(sizeof(char) *20);

memcpy(str4,"luoshuailuo",6);  // 将luoshuailuo这个字符串拷贝到str4中,只拷贝6个字符。

free(str4);

str4 = NULL;

memcmp 比较q

char *name = malloc(sizeof(char) *100);

char *name1 = malloc(sizeof(char) *100 );

strcpy(name, "LUOSHUAI");

strcpy("name1", "luoshuai");

memcmp(name, name1, 100);

free(name);

free(name1);

name = NULL;

name1 = NULL;

有一个字符串,里面包含字符和数字,要求提取数字,并动态分配内存保存。

int *str ="iphone6and8Plus23cc84";

int count = 0;

for(int i = 0; i< strlen(str);i++ ){

  if(*(str+i) >= '0'  && *(str+i) <= '9'){

    count++;

  }

}

int *num =malloc(sizeof(int) * count );

int count = 0;

for(int i = 0; i< strlen(str);i++ ){

  if(*(str+i) >= '0'  && *(str+i) <= '9'){

      *(num+count) =  *(str+i) - 48;  //字符转化为数字 需要减少48

      count++;

  }

}

for(int i = 0 ; i < count; i++){

  printf("%d\n", *(num+i ));

}

free(num);

num = NULL;

自我学习积累篇:

strncpy(destion,source, num ); 该函数的作用是将"source"的第num个长度字符串拷贝到"destion",

如果num < source的长度,则会讲source的前面的num个字符串拷贝到source,不会添加\0

如果num = source的长度,则会将source所有字符拷贝到source,不会添加\0

如果num > source的长度,则会将source所有字符拷贝到source,后面会持续添加\0, 少多个个就添加多少个.

C语言基础10的更多相关文章

  1. C语言基础 (10) 变量作用域,生命周期 内存结构

    01 课程回顾 1.指针数组 注意: 对于数组来说,在使用sizeof的时候a和&a[0]是不一样的, 虽然以%x打印出来他们都是地址 2.值传递 int a; fun(a); int *** ...

  2. C语言基础(10)-数组

    一.数组的定义 数组就是在内存中连续的相同类型的变量空间. 二.数组在内存中的存储方式 同一个数组所有的成员都是相同的数据类型,同时所有的成员在内存中的地址是连续的,数组名是一个地址的常量,代表数组中 ...

  3. C++语言基础(10)-虚继承

    一.产生背景 先看下列一份代码: //间接基类A class A{ protected: int m_a; }; //直接基类B class B: public A{ protected: int m ...

  4. Java入门 - 语言基础 - 10.条件语句

    原文地址:http://www.work100.net/training/java-if-else.html 更多教程:光束云 - 免费课程 条件语句 序号 文内章节 视频 1 概述 2 if...e ...

  5. Java语言基础(10)

    1 方法(三) 案例:Demo1 import java.util.Scanner; public class Demo1 { static int min(int num1,int num2){ i ...

  6. [Coursera][计算导论与C语言基础][Week 10]对于“数组应用练习”课后习题的思考题的一些想法

    (首先,关于Honor Code,我咨询过了Help Center,分享课后练习的思考题的想法是可以的(注意不是代码),但要标明引用,引用格式来源于https://guides.lib.monash. ...

  7. C语言的10大基础算法

    C语言的10大基础算法 算法是一个程序和软件的灵魂,作为一名优秀的程序员,只有对一些基础的算法有着全面的掌握,才会在设计程序和编写代码的过程中显得得心应手.本文包括了经典的Fibonacci数列.简易 ...

  8. GO学习-(10) Go语言基础之指针

    Go语言基础之指针 区别于C/C++中的指针,Go语言中的指针不能进行偏移和运算,是安全指针. 要搞明白Go语言中的指针需要先知道3个概念:指针地址.指针类型和指针取值. Go语言中的指针 任何程序数 ...

  9. 《MSSQL2008技术内幕:T-SQL语言基础》读书笔记(下)

    索引: 一.SQL Server的体系结构 二.查询 三.表表达式 四.集合运算 五.透视.逆透视及分组 六.数据修改 七.事务和并发 八.可编程对象 五.透视.逆透视及分组 5.1 透视 所谓透视( ...

随机推荐

  1. zip格式压缩、解压缩(C#)

    压缩方法 #region 压缩 /// <summary> /// 压缩 /// </summary> /// <param name="bytes" ...

  2. UIAutomator 学习版

    1.要写UIAutomator的testcase,首先要用Eclipse创建一个Java Project 需要将Junit 的lib加入到工程里 2.添加android.jar和uiautomator ...

  3. XJOI网上同步训练DAY2 T1

    [问题描述] 为了迎接校庆月亮中学操场开始施工.不久后操场下发现了很多古墓这些古墓中有很多宝藏.然而学生们逐渐发现自从操场施工之后学校的运气就开始变得特别不好.后来经过调查发现古墓下有一个太守坟由于操 ...

  4. DLNA架构在机顶盒上播放云存储文件的实现

    DLNA 架构在机顶盒上播放云存储文件的实现   摘要: 随着越来越多的数码设备,音像设备等对 UPNP 协议的支持和普及,业界对多媒体内容提供服务的需求越越来越强烈,为了实现遵循 UPNP 协议和  ...

  5. C++的ABI真特么是evil

    果然有些公司明确禁止使用STL也是有一定道理的.其实这个问题的本质就是认为大部分开发者是蠢货,没水平掌控这些细节,项目Release万一出乱子了怎么办?为此吐个槽,我链接一个库时,由于编译参数和链接参 ...

  6. telnet 不是内部或外部 命令

    win7->程序和功能->打开或关闭Windows功能->找到telnet安装下

  7. 【转】UltraISO制作U盘启动盘安装Win7/9/10系统攻略

    U盘安装好处就是不用使用笨拙的光盘,光盘还容易出现问题,无法读取的问题.U盘体积小,携带方便,随时都可以制作系统启动盘. U盘建议选择8G及以上大小的. 下面一步一步讲解如果制作U盘安装盘: 1.首先 ...

  8. Python 协程(gevent)

    协程,又叫微线程,协程是一种用户态的轻量级线程. 协程拥有自己的寄存器上下文和栈.协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈.因此: 协程能保留上 ...

  9. 集成支付宝SDK遇到的坑

    一.首先我先把集成过程说一下.小编想说的话:支付宝是我做支付中觉得坑最多的一个,各种编译不过,各种出问题. 废话不多说,进入主题:1.首先当前是下载官方SDK啦,当前你也可以通过cocopods进行导 ...

  10. python学习之路-6 冒泡算法、递归、反射、os/sys模块详解

    算法 冒泡算法 # 冒泡算法就是将需要排序的元素看作是一个个"气泡",最小的"气泡"最先浮出水面,排在最前面.从小到大依次排列. # 代码如下: li = [9 ...