我认为阅读记忆不会引起任何问题,例如
char *d="";
char *d2="test";
memcmp(d,d2,10);
memcmp()
可以失败吗?
答案 0 :(得分:5)
您的假设不正确,因为在未映射到进程地址空间的地址处读取内存将导致SEGV
。特别是读取地址0(几乎在所有体系结构上),以及读取内核内存空间(如果它甚至被映射到),但通常读取没有物理内存映射为可读的逻辑内存。
在您的示例中,您正在运行memcmp
未分配的字节,这是未定义的行为。它可能会从堆栈或数据段中读取垃圾,但您无法知道这一点。例如,d
可能正好位于堆栈顶部,因此您可能会超出堆栈顶部进入未映射的内存(堆栈通常会向下扩展)。