为什么指针占用未分配给它的内存

时间:2015-11-15 01:28:13

标签: c++ pointers

我正在尝试学习指针行为,我尝试了几个例子。

根据我的理解,"当我们尝试打印指针时,程序应该抛出错误,而未指定值的地址"。

我用指针变量写了一段代码' a'和' b'并直接将值分配给指针' a'。我预计这会导致分段错误。第二个指针' b'取指针的地址' a'。为什么我会看到这种行为?

以下是我的代码块:

int *a;    // What exactly happens behind the scenes here ? What will "a" contain ?
int *b;    // Why does "b" take address of "a" ?
*a = 5;    // Why don't I get a segmentation fault here ?
cout<<a<<endl;
cout<<*a<<endl;
cout<<b<<endl;
cout<<*b<<endl;

我的输出是,

0x246ff20
5
0x246ff20
5

5 个答案:

答案 0 :(得分:3)

  

“当我们尝试打印指针时,程序应该抛出错误,而未指定值的地址”。

实际上,当您尝试使用其值未初始化的变量时,行为(即发生的情况)是undefined

在这种情况下,这意味着您的程序可能因分段错误而崩溃,或者 可以打印一些模糊有意义的内容。 (或nasal demons :-))

您可能会看到的是,某些值恰好位于 now 与这些变量对应的内存位置。这些值最有可能到达那里,因为在执行的早期某处,内存位置被用于其他东西。

答案 1 :(得分:0)

你在那里有很多未定义的行为。

int * a;

包含哪些内容?未定义。完全取决于编译器。在这种情况下,它似乎默认为0x246ff20。我为什么这么说?因为b也设置为此。你不能依赖这个,这可能只是巧合。

恰好这个值似乎是有效的(指向内存中的数据页),写入时不会抛出seg错误。

这也回答了你的其他问题。您观察到的行为完全未定义。

你应该指出你的想法。例如:

int a = 5;
int* pA = &a;
int* pB = pA;

答案 2 :(得分:0)

C / C ++中的所有内容默认都有一个值。但是,该值完全未定义。

某些OS编译器组合可能会将其归零(即,使指针成为空指针),有些可能会插入调试消息&#39;进入他们(比如baadf00d),但大多数只留下以前在记忆中存在的东西。

无论这些值中的内容是什么,编译器都将对它们进行处理,就像您确定它们一样。访问未定义的值是合法的&#34;在C / C ++中,它没有被明确禁止,但并不是一件好事。一些编译器具有警告标志,它会告诉您是否使用了未初始化的变量,但这些并不总是万无一失,因为编译器很难确定何时初始化某些变量。

每当定义一个值时,都应该给它一个默认值。对于指针,可以是NULLnullptr。在更复杂的情况下,一个零值&#34;可能是合法的(如对象的子对象的数量),您可能希望使用第二个变量(如bool initialized)来存储值是合法还是垃圾。

取消引用一个未定义的指针就像你正在做的那样,更像是就像你一样,可能会被操作系统捕获并导致你的程序因内存访问违规而被杀死。我有点惊讶你有任何输出。

答案 3 :(得分:0)

int *a;是一个可以引用每个地方的指针!

当我们可以使用它时,我们为其分配地址或创建新地址,例如:

int *a;           
int *b = a;          // b variable is pointing to a variable (if *a changeed, *b also changed that value)

示例2:

int *a = new int(5);     // a is a variable that allocate a 4 byte memory to it and its first value is 5

cout<<a<<endl;       // physycal address of 'a' variable is print
cout<<*a<<endl;      // value of 'a' variable (that is in 'a' address) is print

答案 4 :(得分:0)

一个方便的小提示,在使用指针时,总是将指针设置为null,然后再将其设置为一个值,这样你总是知道指针不指向一个模糊的内存地址或指向同一个东西作为另一个指针。

使用动态指针后总是使用删除

相关问题