我的想法是通过一个指针变量获得函数内部的一个字符的地址,从而将这个字符输出来,代码如下:
#include <stdio.h> #include <assert.h> char* GetMemory(void) { char* p; char str = 'm'; p = &str; assert(p != NULL); printf("返回前地址 %x/n",p); return p; } int main(int argc, char *argv[]) { char *p; assert(p != NULL); p = GetMemory(); printf("返回后地址 %x/n",p); printf("返回后地址 %c ",*p); return 0; } 结果如下:
输出的w是一个乱码,我一直想不通为什么会这样,因为从地址可以看出,返回前后两者的地址完全一样,那么我通过
指针对相同地址操作,为什么输出结果会有区别,那是因为函数执行完之后,0x22ff43这段内存的使用权并不在程序员
手中,所以出现了乱码!除非重新申请使用这段内存,否则对它的操作都会是暂时的,不确定的!
但是我还是想了个办法,决定直接对这段内存直接操作,代码如下:#include <stdio.h> #include <assert.h> char* GetMemory(void) { char* p; char str = 'm'; p = &str; assert(p != NULL); printf("返回前地址 %x/n",p); return p; } int main(int argc, char *argv[]) { char *p; p = GetMemory(); *(char*)0x22ff43 = 'f';//直接给这段内存赋值 assert(p != NULL); printf("p的地址 %x/n",p); printf("p的值 %c/n",*p); printf("0x22ff43地址输出 %c ",*(int*)0x22ff43); return 0; } 结果如下:
并没有输出字符f!!!!为什么会这样呢???明明对那段内存操作了!!!那么我们就要注意了,虽然是对它进行了操作但是我们对它还是没有所有权!!!我们对那段没有使用权的内存操作是不安全的,它并并不按程序员的想法输出,可能偶尔会执行正确,但是绝大不部分情况是不可预知的!!
局部变量的陷阱
最新推荐文章于 2022-03-02 15:18:06 发布