int main (void) /*case :1 */
{
int *ptr;
*ptr = 4;
return 0;
}
出现段错误。 在这种情况下,ptr 被初始化为 0 地址。我用gdb工具检查了
int main (void) /* case2 */
{
int *ptr;
*ptr = 4;
printf ("%d", ptr);
return 0;
}
它没有给出段错误。 输出= 4;
int main (void) /* case3 */
{
int *ptr;
ptr++;
*ptr = 4;
printf ("%d", ptr);
return 0;
}
再次出现段错误。 在情况 2 和情况 3 中,ptr 值为“0xb76f7000” 我已经检查了该地址属于库文件的进程的映射文件。 猫/proc/10489/maps
08048000-08049000 r-xp 00000000 08:06 788694 /home/durga/app
08049000-0804a000 r--p 00000000 08:06 788694 /home/durga/app
0804a000-0804b000 rw-p 00001000 08:06 788694 /home/durga/app
b754c000-b754d000 rw-p 00000000 00:00 0
b754d000-b76f5000 r-xp 00000000 08:01 132823 /lib/i386-linux-gnu/libc-2.19.so
b76f5000-b76f7000 r--p 001a8000 08:01 132823 /lib/i386-linux-gnu/libc-2.19.so
b76f7000-b76f8000 rw-p 001aa000 08:01 132823 /lib/i386-linux-gnu/libc-2.19.so
b76f8000-b76fb000 rw-p 00000000 00:00 0
b7711000-b7715000 rw-p 00000000 00:00 0
b7715000-b7717000 r--p 00000000 00:00 0 [vvar]
b7717000-b7719000 r-xp 00000000 00:00 0 [vdso]
b7719000-b7739000 r-xp 00000000 08:01 132826 /lib/i386-linux-gnu/ld-2.19.so
b7739000-b773a000 r--p 0001f000 08:01 132826 /lib/i386-linux-gnu/ld-2.19.so
b773a000-b773b000 rw-p 00020000 08:01 132826 /lib/i386-linux-gnu/ld-2.19.so
bfb59000-bfb7a000 rw-p 00000000 00:00 0 [stack]
最佳答案
在所有情况下,您尝试通过未初始化的指针(使用 *ptr = 4;
)进行写入,这是未定义的行为,程序之后的行为并不重要,您永远不能依赖一致的输出。它是否“有效”并不重要,尝试定义未定义的行为是没有用的。
关于c - 为什么野指针是用共享库虚拟地址初始化的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41609322/