c - 如果地址已知,如何通过指针处理地址内容而不触发段错误?

标签 c pointers memory segmentation-fault

我正在学习 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/

相关文章:

java - 如何使 Java 应用程序的内存高效?

c++ - 调用对象的析构函数是否等同于在对象上调用delete?

php - 如何在没有内存错误的情况下使用 var_dump + 输出缓冲?

c++ - C/C++宏嵌套替换逻辑

c - 计算 ((2^n )-1)mod p 的最佳方法

c - 宏 hell : Platform-independent pointer to setjmp/sigsetjmp

c - 如何在以下函数内传递十六进制数据

c++ - 检查两个 QSharedPointer 是否具有相同的数据

c++ - 对指针和常量兼容性的引用

无法使用 printf 正确写入 int