编程范式13 笔记

来源:互联网 发布:福利直播软件 编辑:程序博客网 时间:2024/06/05 22:45

C的编译链接运行

#include<stdio.h>#include<stdlib.h>#include<assert.h>int main(){    void *mom=malloc(foo);    assert(mom!=NULL);    printf("Year!\n");    free(mum);    return 0;}

gcc后会产生.o文件
然后连接产生可执行文件
.o文件是汇编代码
如果不#include<stdlib.h>
会有warning但是还是有.o文件,链接后还是能运行
如果没有#include<assert.h>
就报错了

int main(){int num=65;int length=strlen((char *)&num,num);printf("%d\n",length);//输出0(大端,认为是空)或者1(小端)return 0;}
int memcmp(void *v1);{    int n=17;    int m=memcmp(&n);    //int memcmp(void* v1,void *v2,size)    }

n=17(size)
m(v2)
(v1)
saved pc

c:

CALL<memcmp>

c++

CALL<emcmp_void_p>

所以C++可以重载

segmentation fault & bus error

segmentation fault:错误地解引用,那个地址并没有在段中
bus error:你得到的地址不是你想要的地址

void *vp;*(short *)vp=7//除开short和char,首地址都是4对齐的//short 2对齐//50%概率bus err*(int *)vp=55;//25%概率bus err

buffer overflow

int main(){    int i;    int array[4];    for(i=0;i<=4;i++)    {        array[i]=0;    }    return 0;}

saved pc
i
array[3]
array[2]
array[1]
array[0]
i=4时array[4]=0会让i=0,死循环
buffer overflow

int main(){    int i;    short array[4];    //改int为short会发生什么?    for(i=0;i<=4;i++)    {        array[i]=0;    }    return 0;}

大端系统在执行的时候不会出错
小端系统会
因为4放的位置不同

void foo(){    int array[4];    int i;    for(i=0;i<=4;i++)    {        array[i]-=4;    }}

会导致saved pc减了4
saved pc本应指向CALL<foo>
回退4步
又是死循环

原创粉丝点击