8

C99 [部分6.3.2.1/1] 说

左值是具有对象类型或除 void 以外的不完整类型的表达式; 如果左值在评估时没有指定对象,则行为未定义。

加粗的部分是什么意思?有人可以用一个例子来解释吗?

4

2 回答 2

9

会想到空指针、指向已释放对象的指针和指向具有自动存储持续时间且生命周期已结束的对象的指针。取消引用这些会导致无效的左值;如果幸运的话,您最常遇到的未定义行为是段错误,否则是任意堆或堆栈损坏。

于 2011-01-19T17:48:05.533 回答
6
#include <stdio.h>

int* ptr;

void f(void) {
    int n = 1;
    ptr = &n;
}

int main(void) {
    f();
    // UB: *ptr is an lvalue that is not an object:
    printf("%d\n", *ptr);
    return 0;
}
于 2011-01-19T17:43:40.987 回答