3

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

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

memcmp() 失败吗?

4

1 回答 1

5

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

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

于 2014-03-05T19:42:34.383 回答