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

C 为什么使用共享库虚拟地址初始化野生指针?,c,pointers,initialization,C,Pointers,Initialization,这是一个错误。 在这种情况下,ptr用0地址初始化。我用gdb工具检查过 int main (void) /*case :1 */ { int *ptr; *ptr = 4; return 0; } 这不是给分段错误。 输出=4 int main (void) /* case2 */ { int *ptr; *ptr = 4; printf ("%d", ptr); return 0; } 这又是一个错误。 在情况2和情况3中,ptr值为0xb76f70

这是一个错误。 在这种情况下,ptr用0地址初始化。我用gdb工具检查过

int main (void)   /*case :1 */
{
  int *ptr;
  *ptr = 4;
   return 0;
}
这不是给分段错误。 输出=4

int main (void)  /* case2 */
{ 
  int *ptr;
  *ptr = 4;
  printf ("%d", ptr);
  return 0;
}
这又是一个错误。 在情况2和情况3中,ptr值为0xb76f7000 我已经检查了这个地址属于库文件的进程的映射文件。 cat/proc/10489/maps

int main (void)  /* case3 */
{ 
  int *ptr;
  ptr++;
 *ptr = 4;
  printf ("%d", ptr);
  return 0;
}
一行代码:取消引用指向无效地址的未初始化指针将调用

更详细地说,在您的例子中,ptr是一个自动局部变量。除非显式初始化,否则它包含不确定值。换句话说,指针变量的内容是不确定的。它似乎指向某个有效的内存位置,但该内存位置不必在程序上下文中有效。

ptr是一个指针,您在不使其指向某个有效内存位置的情况下延迟它,这将导致未定义的行为

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指向可以写入的某个有效内存位置。

在所有情况下,您都试图通过*ptr=4;的未初始化指针进行写入;,这是未定义的行为,程序随后的行为无关紧要,您永远不能依赖一致的输出。它是否有效无关紧要,在试图定义未定义的行为时没有用。

int*ptr只声明指向一个int的指针,它不声明指向的int-这由您来做

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

那么为什么C不初始化指针呢?表演在高级语言中,初始化之类的工作是为您完成的,或者有一个特殊的未初始化值,如python中的None和Perl和Ruby中的undef,但您需要支付性能成本


在C语言中,程序员需要跟踪所有内容,包括每个指针指向的对象。

在本例中,ptr用0地址初始化。我用gdb工具检查,它只是不确定分配给本地指针的值。每次它都是零,只是在我的代码中没有使用库函数,我用gdb和objdump检查tools@Gopalakrishna因为这就是GDB为你所做的,停止试图定义未定义的行为。参考:@Gopalakrishna undefined behavior在C中有一个非常具体的含义。在我看来,这与我无关,因为你在这里的观点是不相关的。在用C语言编程时,未定义的行为是一个非常重要的术语。查找它。你不知道它是否无效。只是它是未指定的:它不是未定义的,如果我使用它,它总是指向同一个地址printf@StoryTeller正在更新相同的内容:@Gopalakrishna是的,这是标准中未定义的行为。所以不要这样做,否则你的电脑可能会爆炸。。只是因为它现在这样做并不意味着它总是这样做。为什么?因为它是未定义的行为。@Gopalakrishna-C标准非常好,编译器发出的程序在这种情况下会使计算机爆炸。它将是标准兼容的,因为标准说行为是未定义的,因为它允许更改数据的前4个字节library@Gopalakrishna理解代码中的错误。当你有未定义的行为时,任何事情都可能发生,而找到一个解释是没有意义的。ptr是一个指针,您试图取消对它的引用,它是uninitialized@Gopalakrishna-它可以改变你写的任何地方的前四个字节。C和C++中的变量是未初始化的…抱歉,但是这是夸大其词。厚厚的静电存储。@SouravGhosh Yeh,好的。自动变量未初始化。我猜这篇文章不知道两者的区别,所以用夸张的说法更安全。就我个人而言,我也明确地初始化了堆栈外数据,但那只是我自己。
int *ptr = malloc(sizeof(int));