卸载了好几次重装都还是一样 ,芯片包也下载过了,图标一直是灰色,新建不了工程 ,该如何解决?
芯片包下载后,安装了吗?
先来看一段极其简单的代码:
我们定义了一个局部变量arr作为int类型的数组,然后分别将100-600写到了数组中。那么,数组arr在内存中是怎样表示的呢?
首先,我们编译一下:
注意,-fno-stack-protector选项是为了禁止堆栈保护,让汇编更容易懂些,关于堆栈保护这个话题可以参考这篇文章《黑客攻防:缓冲区溢出攻击与堆栈保护》。
好啦,一切准备就绪,可以庖丁解牛啦,使用的刀就是gdb,代码面前了无秘密,gdb面前程序的运行时(run time)了无秘密。
用gdb来调试刚刚编译出来的程序,这里看一下arr_on_stack函数的汇编指令:
我们在之前的文章多次提到过,每个函数在运行起来后都有属于自己的栈帧,栈帧组成栈区,此时arr_on_stack这个函数的栈区在哪里呢?答案就在寄存器rbp中。
我们来看一下rbp寄存器指向了哪里?
啊哈,原来栈帧在0x7ffffffee2a0这个地方,那么我们的数组arr在哪里呢?别着急,这条指令会告诉我们答案:
这行指令的含义是说把100(0x64)放到rbp寄存器减去0x20的地方,显然,这就是数组的开头,让我们来计算一下rbp寄存器减去0x20:
因此,我们预测arr应该在0x7ffffffee280这个位置上。
接下来,我们用gdb验证一下:
哈哈,怎么样,是不是和我们猜想的一样,数组arr的确就放在了0x7ffffffee280这个位置,是这样存储的:
这就是C语言中所谓的数组了,无非就是从0x7ffffffee280 到 0x7ffffffee298这一段内存嘛,数组在栈区就是这么表示的!
51不选芯片也无所谓。