采取这个人为的例子:
#include <stdlib.h>
#include <string.h>
int main (int argc, char const *argv[])
{
char *buf = malloc(8);
strcpy(buf,"Hello W");
char *last = &buf[4];
size_t u = *(size_t *)(last);
printf("0x%lx",u); // prints "0x57206f" on little endian
return 0;
}
根据我对C的内存管理的(非常基本的)理解,这将导致以下内存读取(假设为64位):
+--+--+--+--+--+--+--+--+--+--+--+--+--+
|H |e |l |l |o | |W |\0|? |? |? |? |… |
+--+--+--+--+--+--+--+--+--+--+--+--+--+
^^^^^^^^^^^^^^^^^^^^^^^
从而访问可能尚未分配给程序并导致崩溃的内存区域。 然而,这似乎在实践中运作良好 - 这是定义的行为吗?
增加:
我从此处显示的代码中创建了此示例:http://www.daemonology.net/blog/2008-06-05-faster-utf8-strlen.html
答案 0 :(得分:2)
你的理解正在停止。
您会得到未定义的行为。当发生这种情况时,确切的可见结果当然是未定义的。你不能声称“它有效,因为它没有崩溃”。不会崩溃肯定会发生一件事,但崩溃也是如此。毕竟,这种行为是未定义的。