摘要: 结合这,这,就可以看懂了,知道了下面几个事实。1. 一个函数体内,初始时会初始化栈空间,用于存放变量,结束时会释放栈空间;2. return是将值放进eax寄存器,然后再将eax寄存器中的值返回给相应变量,这就可以解释返回指针其实只是返回了一个地址;3. 返回一个局部指针后,函数中的局部数组的内存已经被释放,然后内部的值并没有被清楚,只是标记说要删除,但重新访问时,就会进行清除,如下面的代码,这后面举得那个例子,对于输出的值,第一个是0,后面的是乱的也就解释通了。PS: 下面的运行结果,第一个可以正常返回,第二个返回空格字符。char * Cstr(void){ char a[10] =... 阅读全文
posted @ 2013-09-18 21:45 litstrong 阅读(351) 评论(0) 推荐(0) 编辑
摘要: strlen的实现是通过4个字节4个字节进行枚举,然后通过位运算来判断这4个字节中是否有一个字节含有0,这样的话,效率就提高了4倍。这个效率提高是假设a&b&c&d与a&b有差不多效率的前提下。那用8字节8字节来偏移的话,是不是更快呢?32位机上不会,64位机上会提高一倍。因为a&b在64位下会提高一倍,因为32位的寄存器大小是32位的,对于分别MOV高位与低位两次。本来实验a&b&c&d与a&b的速度的,经实验验证,这两个效率确实是差不多的,然后去看汇编,看指令条数,在没有使用-O优化下,指令的条数差别跟运算符号的个数的 阅读全文
posted @ 2013-09-18 20:25 litstrong 阅读(483) 评论(0) 推荐(0) 编辑
摘要: 来源这里的关于数组指针的题目,参考这,这,经过下面的测试:#include #include using namespace std;void test() { char *a = "abc"; printf("%08x %08x\n", a, a + 1);}void test1() { int **a = new int*[10]; for (int i = 0; i < 10; i++) a[i] = new int[10]; for (int i = 0; i < 10; i++) { printf("%08x %08... 阅读全文
posted @ 2013-09-18 15:19 litstrong 阅读(249) 评论(0) 推荐(0) 编辑