c - 为什么野指针是用共享库虚拟地址初始化的?

标签 c pointers initialization

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/

相关文章:

c - 无法使用 gdk_pixbuf_loader 加载 TIFF 图像

String 到 PAnsiChar 转换麻烦

c++ - main() 函数中的默认初始化

java - 什么是 Java 中的双大括号初始化?

ruby - 为什么在 Ruby 中定义新散列的简洁方式不起作用(它们都引用同一个对象)

c - C 中多个嵌套结构的硬故障

c - 标准 C mktime 线程在 Linux 上安全吗?

c - 为什么必须在以下代码中将结果变量声明为指针?

c - 在没有数组的情况下实现优先级队列的插入和删除功能?

java - 指针和垃圾收集