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

Why is pointer taking memory that is not assigned to it

本文关键字:内存 分配 指针 为什么      更新时间:2023-10-16

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

根据我的理解,"当我们试图打印指针时,程序应该抛出错误,而它没有被分配值的地址"。

我用指针变量"a"answers"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

"当我们试图打印指针时,程序应该抛出错误,而指针没有被分配值的地址"。

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

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

您可能看到的是内存位置中的一些值,现在与这些变量相对应。这些值很可能是因为在执行的早期,内存位置被用于其他用途。

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

int*a;

包含在中的内容是什么?未定义。完全取决于编译器。在这种情况下,它似乎默认为0x246ff20。我为什么这么说?因为CCD_ 1也被设置为此。你不能相信这一点,这可能只是巧合。

恰好该值似乎是有效的(指向内存中的数据页),在写入.时不会引发seg错误

这也回答了你剩下的问题。你观察到的行为是完全没有定义的。

你应该把你的指针指向一些东西。例如:

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

int *a;是一个指针,可以引用每个where!

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

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
默认情况下,C/C++中的所有内容都有一个值。然而,这个值是完全没有定义的。

一些操作系统编译器组合可能会将其归零(即,使指针为空指针),有些可能会在其中插入调试"消息"(如baadf00d),但大多数只是将以前在内存中的内容保留在那里。

无论这些值中的内容是什么,编译器都会将它们视为定义了它们。访问未定义的值在C/C++中是"合法的",因为它没有被明确禁止,但这不是一件好事。有些编译器有警告标志,可以告诉你是否使用了未初始化的变量,但这些并不总是万无一失的,因为编译器很难确定某些变量何时初始化。

无论何时定义一个值,都应该给它一个默认值。对于指针,它将是NULLnullptr。在更复杂的情况下,"零值"可能是合法的(比如对象的子对象数量),您可能希望使用第二个变量,如bool initialized,来存储这些值是合法的还是垃圾的。

像现在这样取消引用未定义的指针,更不用说像现在这样向其写入了,很可能会被操作系统捕获,并导致您的程序因内存访问违规而被终止。我有点惊讶你得到了任何输出。

一个方便的小提示,当使用指针时,在将指针设置为值之前,请始终将其设置为null,这样您就可以始终知道指针不是指向一个模糊的内存地址,也不是指向与另一个指针相同的东西。

并且在使用动态指针之后始终使用delete