类型不同的指针可以指向同一内存单元吗?

时间:2022-12-26 01:17:52
调试的时候发现一个现象,类型不同的指针能指向同一内存单元吗?这打印出来的内存地址,是计算机物理内存的实际地址,还是说是程序为每种类型分别分配的一段内存?
如下,信息为同一段程序同一时刻打印:
(lldb) print result
(char **) $9 = 0x000000010010b5f0

(lldb) print result[2]
(char *) $12 = 0x000000010010b5f0 "p\x98\x10"


另外,还有一个问题,一个char** result指针在子函数realloc后指向地址改变,然后递归回退回去后有语句要用result时调用的还是之前没有realloc的result(因为上下文保留的是原result,所以子函数realloc后虽然地址改变但回退后父函数读不到?),这种情况怎么解决?

9 个解决方案

#1


指针就是地址,与类型无关, 在操作系统下一般都是虚存地址

#2


可以,与类型无关

#3


你能看到的地址都是虚拟地址,计算机为每一个程序分配4G虚拟内存,就是说可能两个同时运行的程序,他们可能用相同的虚拟地址,但是物理地址是完全不一样的,指针就是保存地址的变量,所以他的值是任意的,也就是它可以指向任何位置,在程序员眼中没有类型,只有内存的概念,int a = 0x1234 5678; char* b = (char*)&a; int* c = &a;b和c指向同一个地址,只不过*b,*c的值不一样罢了

#4


Why not?

#5


有些可以有些不行

#6


1.可以啊,.c++数据类型决定了数据的长度和取值范围,也就是说指向同一地址的指针根据其定义时类型,来确定应该读取的数据字节数
2.没看懂什么问题...检查下子函数的传值方式是不是用了值传递,,返回的时候被销毁了..?

#7


引用 3 楼 sunjilonggood 的回复:
你能看到的地址都是虚拟地址,计算机为每一个程序分配4G虚拟内存,就是说可能两个同时运行的程序,他们可能用相同的虚拟地址,但是物理地址是完全不一样的,指针就是保存地址的变量,所以他的值是任意的,也就是它可以指向任何位置,在程序员眼中没有类型,只有内存的概念,int a = 0x1234 5678; char* b = (char*)&a; int* c = &a;b和c指向同一个地址,只不过*b,*c的值不一样罢了

本问题的地址是同一个程序断点步进时在同一函数的同一时刻打印的。
那么照你说的,此2个地址的物理地址和虚拟地址都是相同的,只是地址0x000000010010b5f0被按照char *形式取值时,取到的值是"p\x98\x10",刚好是字符串形式所以能打印出来;而该地址被按照char **形式取值时,在"p\x98\x10"的基础上又做了一个char *取值,由于不是地址形式所以取不到内容,是这个意思吗?
那么也就是说地址0x000000010010b5f0被按照char *取值时值为"p\x98\x10",如果被按照int *取值那么就可能是11215216是么?

#8


可以 , 打印出来的地址应该是一样的,因为打印的是起始位置

#9


地址都是整形的,应该可以~

#1


指针就是地址,与类型无关, 在操作系统下一般都是虚存地址

#2


可以,与类型无关

#3


你能看到的地址都是虚拟地址,计算机为每一个程序分配4G虚拟内存,就是说可能两个同时运行的程序,他们可能用相同的虚拟地址,但是物理地址是完全不一样的,指针就是保存地址的变量,所以他的值是任意的,也就是它可以指向任何位置,在程序员眼中没有类型,只有内存的概念,int a = 0x1234 5678; char* b = (char*)&a; int* c = &a;b和c指向同一个地址,只不过*b,*c的值不一样罢了

#4


Why not?

#5


有些可以有些不行

#6


1.可以啊,.c++数据类型决定了数据的长度和取值范围,也就是说指向同一地址的指针根据其定义时类型,来确定应该读取的数据字节数
2.没看懂什么问题...检查下子函数的传值方式是不是用了值传递,,返回的时候被销毁了..?

#7


引用 3 楼 sunjilonggood 的回复:
你能看到的地址都是虚拟地址,计算机为每一个程序分配4G虚拟内存,就是说可能两个同时运行的程序,他们可能用相同的虚拟地址,但是物理地址是完全不一样的,指针就是保存地址的变量,所以他的值是任意的,也就是它可以指向任何位置,在程序员眼中没有类型,只有内存的概念,int a = 0x1234 5678; char* b = (char*)&a; int* c = &a;b和c指向同一个地址,只不过*b,*c的值不一样罢了

本问题的地址是同一个程序断点步进时在同一函数的同一时刻打印的。
那么照你说的,此2个地址的物理地址和虚拟地址都是相同的,只是地址0x000000010010b5f0被按照char *形式取值时,取到的值是"p\x98\x10",刚好是字符串形式所以能打印出来;而该地址被按照char **形式取值时,在"p\x98\x10"的基础上又做了一个char *取值,由于不是地址形式所以取不到内容,是这个意思吗?
那么也就是说地址0x000000010010b5f0被按照char *取值时值为"p\x98\x10",如果被按照int *取值那么就可能是11215216是么?

#8


可以 , 打印出来的地址应该是一样的,因为打印的是起始位置

#9


地址都是整形的,应该可以~