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