为什么使用共享库虚拟地址初始化Wild指针?

时间:2017-01-12 09:24:54

标签: 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;
}

它没有给出分段错误。 output = 4;

int main (void)  /* case3 */
{ 
  int *ptr;
  ptr++;
 *ptr = 4;
  printf ("%d", ptr);
  return 0;
}

它再次给出了分段错误。 在案例2和案例3中,ptr值为" 0xb76f7000" 我已经检查了该地址属于库文件的进程的map文件。 cat / 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]

4 个答案:

答案 0 :(得分:3)

在所有情况下,您都试图通过未初始化的指针(使用*ptr = 4;)进行写入,这是未定义的行为,之后程序的行为无关紧要,您永远不能依赖于一致的输出。是否"工作"或不是无关紧要的,没有用于尝试定义未定义的行为。

答案 1 :(得分:1)

单行: 取消引用未初始化的指针(指向无效地址)会调用undefined behavior

详细说明,在您的情况下,ptr是一个自动局部变量。除非明确初始化,否则它包含不确定的值。换句话说,指针变量的内容是不确定的。它可能似乎指向一些有效的内存位置,但该内存位置无需在您的程序上下文中有效。

答案 2 :(得分:0)

ptr是一个指针,你正在引用它而不指向某个有效的内存位置,这将导致未定义的行为。

int *ptr = malloc(sizeof(int));

现在ptr指向一个可以写入的有效内存位置。

答案 3 :(得分:0)

int *ptr只声明指向int 的指针,它不会声明指向int - 这是你要做的。

C(和C ++)中的自动变量未初始化(请参阅Non-static variable initialization)。未初始化变量的实际值(如int *ptr)是不确定的。在您更改某些代码或更改编译器之前,它可能会保持一致,但这不确定,永远不能依赖它。

那么为什么C不能初始化指针?性能。在高级语言中,诸如初始化之类的事情已经为您完成,或者存在一个特殊的“未初始化”值(如python中的None和Perl和Ruby中的undef),但是您支付了性能成本

在C中,程序员应该跟踪所有内容,包括每个指针指向的内容。