c++:没有得到分段错误时,我应该
C++: not getting segfaults when I should be
在注意到另一个项目中发生了一些奇怪的事情后,我写了下面的代码。即使数组被多次调用越界,这段代码也不会产生段错误。有人能向我解释一下为什么没有从运行下面的代码段故障?
#include <stdlib.h>
#include <stdio.h>
int main()
{
int *a = (int *)malloc(4 * sizeof(int));
int *b = (int *)malloc(3 * sizeof(int));
int i = 0;
for(i =0; i <3 ; i++)
{
b[i] = 3+i;
}
for(i = 0; i < 4; i++)
{
a[i] = i;
}
for(i = 0; i < 100 ; i++){
a[i] = -1;
}
for(i = 0 ; i < 100 ; i++){
printf("%d n", b[i]);
}
}
只有当您试图访问未映射到进程中的内存位置时,才会发生段错误。
malloc是从构成堆的更大的预分配内存块中获取的。例如,系统可能会在4K块中创建(或增加)堆,因此超出数组的边界仍然会在已经分配给进程的堆内存块内(并且它会为后续的mallocs分配内存)。
在另一种情况下(先前分配了更多内存,因此malloc接近堆块的末尾),这可能会出现段错误,但基本上不可能预测到这一点(特别是考虑到不同的平台或编译器)。
未定义行为未定义。任何事情都有可能发生,包括"正确"行为的出现。
当一个进程试图访问不属于该进程的操作系统帐户的内存时,会发生分段错误。由于操作系统内部的内存记帐是按页计算的(通常1页= 4 KB),因此进程可以访问分配的页内的任何内存,而操作系统不会注意到它。
- 应该使用
new
而不是malloc
- 平台是什么?
- 当你尝试未定义的行为-提示它是未定义的。
相关文章:
- 我应该使用什么来代替void作为变体中的替代类型之一
- 0-1背包代码中的错误.我的代码中有什么错误
- boost::asio::steady_timer()与sleep()我应该使用哪一个
- 我应该实现右值推送功能吗?我应该使用std::move吗
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 我应该删除矢量<short>吗?
- 我应该如何修改此代码以使用给定字符串中的字母打印菱形图案
- 我应该在锁定TBitmap画布后解锁它吗
- 我收到同义重复编译器错误。我应该如何修复"类型"X"的参数与类型"X"的参数不兼容?
- 我应该如何修复瓦尔格林德的未初始化值错误?
- 我应该如何处理:错误 C2039 "分配":不是 Visual Studio 2017 中"cl::string"的成员?
- 我应该在标头"fcntl.h"中修改此错误吗?
- 我应该在两个地方处理WSARecv()的错误吗
- 当服务器重新启动并且客户端收到WSAECONNRESET错误代码时,我应该重新创建整个套接字吗
- 我应该使用 Malloc 吗?包含大量对象的错误
- 我应该如何处理基于C++的dll中的错误
- GCC 4.4.3常量表达式错误的偏移.我应该如何解决这个问题
- c++:没有得到分段错误时,我应该
- 我应该从Boost::filesystem::copy中看到哪些错误代码?
- 我应该如何纠正错误"reference to 'p' is ambiguous"?