我正在学习 C,我想访问(只是为了看看地址里面有什么,实际上是为了好玩。)C 中特定地址中的内容,例如:
char *p = (char *)0x7ffeefad7be8;
printf("%s",*p);
但它显示段错误。我知道内存的一部分是 保留且无法访问,内核空间,例如但我认为该地址是可以访问的,因为它是我从这段代码中获得的地址:
int *p,a;
p = &a;
printf("%p",p);
所以它应该在[heap]和[stack]范围内。(它与第一个代码分开,只是证明地址是可访问的)
但是错误一直报!我做了很多尝试和研究,但还是不行。
这是$cat/proc/self/maps
的输出:
00400000-0040c000 r-xp 00000000 08:09 3942120/usr/bin/cat
0060b000-0060c000 r--p 0000b000 08:09 3942120/usr/bin/cat
0060c000-0060d000 rw-p 0000c000 08:09 3942120/usr/bin/cat
01a4f000-01a70000 rw-p 00000000 00:00 0 [堆]
7f960e06f000-7f960e23b000 r--p 00000000 08:09 3969887/usr/lib/locale/locale-archive
7f960e23b000-7f960e3d2000 r-xp 00000000 08:09 3935387/usr/lib/libc-2.23.so
7f960e3d2000-7f960e5d2000 ---p 00197000 08:09 3935387/usr/lib/libc-2.23.so
7f960e5d2000-7f960e5d6000 r--p 00197000 08:09 3935387/usr/lib/libc-2.23.so
7f960e5d6000-7f960e5d8000 rw-p 0019b000 08:09 3935387/usr/lib/libc-2.23.so
7f960e5d8000-7f960e5dc000 rw-p 00000000 00:00 0 7f960e5dc000-7f960e5ff000 r-xp 00000000 08:09 3935386/usr/lib/ld-2.23.so
7f960e7ba000-7f960e7bd000 rw-p 00000000 00:00 0 7f960e7dd000-7f960e7ff000 读写 00000000 00:00 0 7f960e7ff000-7f960e800000 r--p 00023000 08:09 3935386/usr/lib/ld-2.23.so
7f960e800000-7f960e801000 rw-p 00024000 08:09 3935386/usr/lib/ld-2.23.so
7f960e801000-7f960e802000 rw-p 00000000 00:00 0 7fff58c4c000-7fff58c6d000 rw-p 00000000 00:00 0 [堆栈]
7fff58d0e000-7fff58d11000 r--p 00000000 00:00 0 [vvar]
7fff58d11000-7fff58d13000 r-xp 00000000 00:00 0 [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
我真的很想弄清楚为什么它不起作用,因为我花了几个小时来尝试。谢谢!
最佳答案
我想问题不是来自直接访问p
点添加的地址。相反,您想要打印 p
指向的 ASCIIZ 字符串,这意味着 printf
将(尝试)从那里访问内存,直到遇到第一个 NUL 字节。很可能在允许的数据段结束之前不会出现 NUL。
如果您首先分配a=0
,那么第一个字节ep
指向的应该已经是NUL,并且不会触发任何错误。
关于c - 如果地址已知,如何通过指针处理地址内容而不触发段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37352401/