分配一个变量是编译器还是系统的工作?
作者:明月楼高
链接:https://www.zhihu.com/question/40197087/answer/85434085
链接:https://www.zhihu.com/question/40197087/answer/85434085
1、全局变量中的指针默认指向0,栈中的指针默认指向0xcccccccc,堆中的指针默认指向0xcdcdcdcd。对于在windows下的c语言写出的控制台程序和窗体程序,全局变量和局部static变量都是放在全局区域,这部分区域默认是0,至于为什么是0,我不知道。
2、栈中的指针,也就是在函数函数体内(包括main和其他的入口函数)声明的指针,默认值是0xcccccccc,在看汇编的时候可以发现,在函数调用过程中,参数入栈,调整栈帧后,编译器会生成一段额外的代码用来初始化调用栈,也就是把这些地方的数据全部改为0xcccccccc(0xcc的汇编语言是int3,中止的意思,相当于插入断点)。
3、堆区的数据默认是0xcd(堆区可以分配的地方默认是0xcd,关于堆我了解的不多,有误请指出),但是在堆中的指针我还没有见过,int*p=new int这种方法定义的指针p在栈中,它ta指向堆中的一个地方。
4、delete和free只是把堆中的这块区域标记为空闲。标记空闲只需要把该区域加入到堆的空闲链表中就可以了。如果要置0,效率会低。
5、内存中残留数据一般出现在堆中,这些数据应该很难被黑了利用吧,第一,这些数据在庞大的堆中,由于已经泄露,所以找到他们很难,其次,就算找到了这些数据的位置,但你不知道这些16进制数代表什么?字符?数字?还是其他。不过不排除一些黑客真的去找到了这些数据然后进行分析。比如你把你的银行卡密码存了起来然后只是简单的把ta delete掉, int* key=new int,*key=123456,delete key,这样的话123456还在堆中,还是可以找到的(就像大海捞针,只是不太容易
2、栈中的指针,也就是在函数函数体内(包括main和其他的入口函数)声明的指针,默认值是0xcccccccc,在看汇编的时候可以发现,在函数调用过程中,参数入栈,调整栈帧后,编译器会生成一段额外的代码用来初始化调用栈,也就是把这些地方的数据全部改为0xcccccccc(0xcc的汇编语言是int3,中止的意思,相当于插入断点)。
3、堆区的数据默认是0xcd(堆区可以分配的地方默认是0xcd,关于堆我了解的不多,有误请指出),但是在堆中的指针我还没有见过,int*p=new int这种方法定义的指针p在栈中,它ta指向堆中的一个地方。
4、delete和free只是把堆中的这块区域标记为空闲。标记空闲只需要把该区域加入到堆的空闲链表中就可以了。如果要置0,效率会低。
5、内存中残留数据一般出现在堆中,这些数据应该很难被黑了利用吧,第一,这些数据在庞大的堆中,由于已经泄露,所以找到他们很难,其次,就算找到了这些数据的位置,但你不知道这些16进制数代表什么?字符?数字?还是其他。不过不排除一些黑客真的去找到了这些数据然后进行分析。比如你把你的银行卡密码存了起来然后只是简单的把ta delete掉, int* key=new int,*key=123456,delete key,这样的话123456还在堆中,还是可以找到的(就像大海捞针,只是不太容易