栈区间:在函数内部声明的变量都存放在栈区间,比如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. jquery实现导航栏头部点击变换颜色

    实现效果如下: 话不多说直接上代码: <!DOCTYPE html> <html lang="en"> <head> <meta char ...

  2. BZOJ1013 球形空间产生器sphere

    Description 有一个球形空间产生器能够在n维空间中产生一个坚硬的球体.现在,你被困在了这个n维球体中,你只知道球面上n+1个点的坐标,你需要以最快的速度确定这个n维球体的球心坐标,以便于摧毁 ...

  3. 考查嵌入式C开发人员的最好的16道题

    约定:   1) 下面的测试题中,认为所有必须的头文件都已经正确的包含了    2)数据类型             char 一个字节 1 byte        int 两个字节 2 byte ( ...

  4. 从头到尾彻底理解KMP(2014年8月22日版)

    http://blog.csdn.net/v_july_v/article/details/7041827

  5. C语言---类型转换

    itoa 功 能:把一整数转换为字符串 用 法:char *itoa(int value, char *string, int radix); 详细解释:itoa是英文integer to array ...

  6. Linux上的设备管理器

    一般windows上我们用它自带的“设备管理器”来查看,管理,安装,卸载驱动. 那么问题来了,Linux上用什么命令来看呢? 可以用: lshw   lsusb lspci lsmod 查看特定模块. ...

  7. 13.1.17 CREATE TABLE Syntax

    13.1.17 CREATE TABLE Syntax 13.1.17.1 CREATE TABLE ... LIKE Syntax 13.1.17.2 CREATE TABLE ... SELECT ...

  8. tmux 配置

    tmux配置文件名为.tmux.conf,位于用户根目录下. 常用的配置为: # vimsetw -g mode-keys vibind [ copy-modebind -t vi-copy v be ...

  9. poj 1503 大数相加(java)

    代码: import java.math.*; import java.util.Scanner; public class Main { public static void main(String ...

  10. 关于部分应用无法向POJ提交代码的解决方案

    有个一年没做过题了,最近有骚年反映他们的VirtualJudge无法做POJ的题目,一直都是JudgeError状态. 于是登录到那个VJudge试了试,代码的确一直无法提交成功,他们的服务器发回50 ...