C 读取内存时是否会出现分段故障?

C 读取内存时是否会出现分段故障?,c,segmentation-fault,memcmp,C,Segmentation Fault,Memcmp,我认为阅读记忆不应该引起任何问题 char *d=""; char *d2="test"; memcmp(d,d2,10); memcmp()是否会失败?您的假设不正确,因为读取未映射到进程地址空间的地址处的内存将导致SEGV。特别是读取地址0(在几乎所有的体系结构上),读取内核内存空间(如果它映射到),但通常读取逻辑内存,而没有物理内存映射为可读的 在您的示例中,您正在未分配的字节上运行memcmp,这是未定义的行为。它可能会从堆栈或数据段中读取垃圾,但您无法知道这一点。例如,d可能位于堆栈

我认为阅读记忆不应该引起任何问题

char *d="";
char *d2="test";
memcmp(d,d2,10);

memcmp()
是否会失败?

您的假设不正确,因为读取未映射到进程地址空间的地址处的内存将导致
SEGV
。特别是读取地址0(在几乎所有的体系结构上),读取内核内存空间(如果它映射到),但通常读取逻辑内存,而没有物理内存映射为可读的


在您的示例中,您正在未分配的字节上运行
memcmp
,这是未定义的行为。它可能会从堆栈或数据段中读取垃圾,但您无法知道这一点。例如,
d
可能位于堆栈顶部,因此您可能会超出堆栈顶部运行到未映射的内存中(堆栈通常向下增长)。

memcmp(0,0,10)将出现故障。。。它假设指针参数指向程序中的有效内存。@amdn,我不确定“will”,因为行为有些未定义。@s.bandara您是对的,这是未定义的行为,但它在我所知道的每个系统上都会出错。@amdn:“但它在我所知道的每个系统上都会出错”-我非常怀疑。。。只要它能够在
d2
之后读取接下来的5个字节,它就完成了比较,因此如果内存保护是基于页面大小进行安排的,页面大小足以容纳两个字符串文本,那么它就不会出错,如果程序中其他地方的合法可读数据恰好被压缩在
d2
@amdn:oh,那就足够了…:-)之后的5个字节中,它也不会出错。20年前可以在许多系统上工作,但据我所知,没有现代的非嵌入式系统。“从堆栈或数据段读取垃圾”/“
d
可能就在堆栈的顶部”-无论
d
本身在哪里,因为它是读取
memcmp()
是从存储在
d
中的地址开始的,这是很危险的-我们知道它被设置为字符串文字,永远不会在堆栈上-传统上它在数据段中。“d”的内存不会像Tony说的那样分配在只读部分而不是函数堆栈上吗?
d
是一个指针(
char*
)因此
d
本身将不是只读的。
d
指向的数据可能位于只读存储器中,也可能位于可写区域中;你不能保证它在哪里,也不能保证它的可写性,也不能阻止编译器把它(例如)放在堆栈的顶部。关键是超出它的读数是未定义的。