为什么指针占用未分配给它的内存
Why is pointer taking memory that is not assigned to it
我正在尝试学习指针的行为,并尝试了几个例子。
根据我的理解,"当我们试图打印指针时,程序应该抛出错误,而它没有被分配值的地址"。
我用指针变量"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
一些操作系统编译器组合可能会将其归零(即,使指针为空指针),有些可能会在其中插入调试"消息"(如baadf00d),但大多数只是将以前在内存中的内容保留在那里。
无论这些值中的内容是什么,编译器都会将它们视为定义了它们。访问未定义的值在C/C++中是"合法的",因为它没有被明确禁止,但这不是一件好事。有些编译器有警告标志,可以告诉你是否使用了未初始化的变量,但这些并不总是万无一失的,因为编译器很难确定某些变量何时初始化。
无论何时定义一个值,都应该给它一个默认值。对于指针,它将是NULL
或nullptr
。在更复杂的情况下,"零值"可能是合法的(比如对象的子对象数量),您可能希望使用第二个变量,如bool initialized
,来存储这些值是合法的还是垃圾的。
像现在这样取消引用未定义的指针,更不用说像现在这样向其写入了,很可能会被操作系统捕获,并导致您的程序因内存访问违规而被终止。我有点惊讶你得到了任何输出。
一个方便的小提示,当使用指针时,在将指针设置为值之前,请始终将其设置为null,这样您就可以始终知道指针不是指向一个模糊的内存地址,也不是指向与另一个指针相同的东西。
并且在使用动态指针之后始终使用delete
- Win32编译器选项和内存分配
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 当需要超过16GB的连续内存时,内存分配失败
- 尝试摆脱任何堆内存分配
- 以下代码执行哪种内存分配(动态或静态)?
- 开放 CV 中的动态内存分配,用于视频处理
- 为什么类和 main() 函数中也有动态内存分配
- 使用 NTAllocateVirtualMemory 和 GetProcAddress 的内存分配问题不起作用
- C++:矢量分配器行为、内存分配和智能指针
- 介于 [固定数组] 和 [带内存分配的指针] 之间的性能
- Linux C++ 中的页面对齐内存分配
- 整数内存分配/释放
- 将内存分配返回值强制转换为 TYPE 数组
- C++程序什么都不做,但瓦尔格林德显示内存分配
- 给定特定内存地址的数组的动态内存分配
- 如何完成内存分配
- 我刚刚了解了C++中的动态内存分配
- 在先前调用 string::find 后添加内存分配和内存集会导致它返回 npos.为什么?
- 对于堆上的页面对齐内存分配是否有任何优化或不同的 API?
- 无法删除布尔动态内存分配