C数组名与指针,sizeof与strlen,free与delete区别,野指针,编译过程简介

数组名与指针

1.区别:数组名是一个指针常量,但可以标识数组长度
2.传参:值传递机制,故仅传递地址,丢失了标识的功能
3.与sizeof
∵sizeof是取字节运算符(关键字)
∴用数组名,作为操作数,与用数组名,作为实参的区别在于还能否标识数组长度
Eg:
(1)代码
int arr[3]={1,2,3};
int arrLen=sizeof(arr)/sizeof(int);//获得数组长度
(2)类似:数组与下标运算符的关系,eg:arr[1]中的‘[]’

sizeof与strlen区别

sizeof和strlen区别
生成可执行文件的过程:
(以Linux下为例)
一.指令:gcc hello.c
二.步骤

  • 预处理(Preprocessing)
  • 编译(Compilation)
  • 汇编(Assembly)
  • 链接(Linking)

预处理
(1)过程

  • 删除#define,展开宏定义
  • 处理条件预编译指令,比如#if #ifdef #elif #else #endif等
  • 处理#include预编译指令,将被包含的文件插入到该预编译指令的位置。
  • 删除所有注释 “//”和”/* */”.
  • 添加行号和文件标识,以便编译时产生调试用的行号及编译错误警告行号
  • 保留#pragma编译器指令,因编译器需要使用它们
    (2)指令
    gcc -E hello.c -o hello.i 参数-E表示只进行预处理
    或者cpp hello.c > hello.i /* cpp – The C Preprocessor */
    再cat hello.i 可看到预处理后的代码

编译
(1)过程:把预处理完的文件 进行一系列的词法分析,语法分析,语义分析及优化后生成相应的汇编代码
(2)指令
gccShello.iohello.s /usr/lib/gcc/i486-linux-gnu/4.4/cc1 hello.c
(3)注意:现在的GCC把预处理和编译两个步骤合成一个步骤,用cc1工具来完成。
gcc其实是后台程序的一些包装,根据不同参数去调用其他的实际处理程序,比如:预编译编译程序cc1、汇编器as、连接器ld

汇编
(1)作用:将汇编代码转变成机器可以执行的命令
(2)过程:每一个汇编语句几乎都对应一条机器指令。汇编相对于编译过程比较简单,根据汇编指令和机器指令的对照表一一翻译即可。
(3)指令
gccchello.cohello.o as hello.s –o hello.co
由于hello.o的内容为机器码,不能以普通文本形式的查看(vi 打开看到的是乱码)

链接
(1)过程:调用链接器ld来链接程序运行需要的一大堆目标文件,以及所依赖的其它库文件,最后生成可执行文件
(2)指令
ld -static crt1.o crti.o crtbeginT.o hello.o -start-group -lgcc -lgcc_eh -lc-end-group crtend.o crtn.o (省略了文件的路径名)。

野指针成因主要有三种
一、指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值随机
二、指针p被free或者delete之后,它们只是把指针 所指的内存 给释放掉,没有置为NULL,而是指向“垃圾”内存,让人误以为p是个合法的指针
三、指针操作超越了变量的作用范围。
Eg:不要返回 指向 栈内存 的 指针 或 引用 ,因为栈内存在函数结束时会被释放
c的free和c++的delete的区别
(1)delete 用于释放new分配的内存,和new成对调用
free用于释放malloc分配的内存,和malloc成对调用
(2)使用free释放时需要判断指针是否为NULL,delete不用
(3)free释放内存,但不调用对象的析构函数
delete不仅释放内存,还调用对象的析构函数
(4)delete和new是对对象的操作,是运算符
free和malloc是对内存空间的操作

今天学习遇到的问题

/*循环变量i的作用域虽只在for内有效,但生命周期是整个函数运行过程*/
    int arr1[3]={1,2,3};
    int arr2[3]={3,2,1};
    for(int i=0;i<3;i++){
        printf("%d\n",arr2[i]);
    }
    for(int i=0;i<3;i++){         //编译报错,因为2个i
        printf("%d\n",arr1[i]);
    }
/*引申,同一个函数内,{}中定义的变量,不能再次定义*/

以及复习的知识点

/*无论是什么数据,定义时都要初始化*/
/*数组可以缺省长度*/
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值