编程范式13 笔记

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步
又是死循环

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值