【发布时间】:2015-05-02 09:59:13
【问题描述】:
我最近在一次采访中被问到这个问题:
char* p = NULL;
cout << p << endl;
++p;
cout << p << endl;
我给出的答案是第一个 cout 将打印 00000,然后将打印 00001。 但是当我在visual studio中检查它时,它给出了一个例外: StringFunctions.exe 中 0x009159F1 处的第一次机会异常:0xC0000005:访问冲突读取位置 0x00000000。 StringFunctions.exe 中 0x009159F1 处未处理的异常:0xC0000005:访问冲突读取位置 0x00000000。
但对于 int、float 等,它按预期工作。 有人可以解释一下吗? 感谢您的帮助!
【问题讨论】:
-
未定义的行为。 stackoverflow.com/a/19180731/1462718 和 stackoverflow.com/a/394774/1462718 请参阅“请注意,严格递增包含空指针值的指针是未定义的行为”。
-
这不是建议线程的副本。虽然 OP 通过递增空指针来调用 UB,但他主要关心的是如何打印指针的地址。