如果指针超出范围会发生什么情况
What happens if a pointer runs out of scope
我有以下代码,我想知道为什么它会这样工作:
void addFive(int* a) {
int* b;
b = a;
*b = *b + 5;
}
int main(int argc, char** argv) {
int* nbr;
*nbr = 3;
addFive(nbr);
std::cout << *nbr << std::endl;
return 0;
}
这将产生 8 的输出。
我想知道为什么?指针int* b
超出 addFive 函数末尾的范围。此外,int* b
不知道int* nbr
的存在(智能指针的一个优点)。我希望代码会在行std::cout << *nbr << std::endl;
中创建分段错误
为什么这段代码没有给出分段错误?
函数addFive
本身是正常的,但它应该这样写:
void addFive(int* a)
{
*a += 5;
}
指针的b
范围没有任何问题,因为指针本身只是一个局部变量。
代码中真正的问题是您没有为整数分配内存,并尝试通过指针nbr
访问未初始化的内存,这会导致您出现未定义的行为。在我的机器上,我在这条线上有分段错误:
*nbr = 3;
你的主干应该这样重写:
int* nbr = new int(3);
addFive(nbr);
std::cout << *nbr << std::endl;
return 0;
然后,您可以可靠地期望输出中的"8"。
为什么这段代码没有给出分段错误?
您对分段错误的预期是正确的。但是所有随机访问内存都不会产生分段错误。如果随机访问的内存具有任何保护权限,则只有它会产生分段错误。如果它没有任何保护,那么您可以毫无问题地访问内存,但具有未定义的行为,因为您无法假设随机内存中的内容。这里有一个很好的图片解释。
相关文章:
- 将指针分配给另一个指针时会发生什么情况?
- 在什么情况下,两个堆栈分配的结构对象的 this 点指向同一个地址?
- 在什么情况下,我想在 C/C++ 代码中使用内联汇编代码
- 发生注入类名时会发生什么情况?(C++)
- 在什么情况下,需要共享智能指针而无法使用唯一指针?
- 重新分配向量时,向量中的内存会发生什么情况
- 如果结构中的字符串比使用的 p/调用签名长或短,会发生什么情况?
- 为什么或在什么情况下,你会将参数作为C++中的引用(或指针)传递给函数?
- 如果我向一个12字节的缓冲区写入的字节数少于12,会发生什么情况
- 删除对象(具有不同类型)的引用时会发生什么情况?
- 如果我在 c++ 中以 new 的放置形式使用没有足够的内存,会发生什么情况?
- 使用 Google 基准测试时返回值会发生什么情况?
- 正在连接的等待条件变量的线程会发生什么情况?
- 如果未定义的C++行为符合 C 定义的行为,会发生什么情况?
- 在什么情况下,使用'const T*'输入参数比'const T&'更可取?
- 如果字符串在 C/C++ 中没有 NUL 字符(以防编译器允许它通过)会发生什么情况?
- 将虚拟方法定义为私有方法时会发生什么情况?
- 如果我将"reference to vector"分配给"vector"会发生什么情况
- C++ OpenCL:当缓冲区超出范围时,子缓冲区会发生什么情况?
- 如果指针超出范围会发生什么情况