你是否被允许对你不再拥有的数组执行指针运算?

时间:2017-07-17 12:33:06

标签: c

考虑

int main()
{
    char* p = malloc(5);
    printf("%td", &p[5] - &p[0]); /*one past the end is allowed*/
    free(p);
    printf("%td", &p[5] - &p[0]); /*I no longer own p*/
}

是否定义了此代码的行为?你是否被允许对你不再拥有的数组执行指针算法?

2 个答案:

答案 0 :(得分:4)

是的,通常允许您在许多环境中的许多编译器上执行此操作。

但是,您必须记住,当您执行此操作时,ISO C标准对您的语言没有任何要求,但是:它没有定义行为任何使用一个值为“indeterminate”的指针。根据ISO C,p之后的free(p)的值与未初始化的状态基本相同。

答案 1 :(得分:3)

您是在寻找语言律师答案还是实际答案?

语言律师的答案是,不,它未定义。

实际的答案是:是的,它可能会起作用,但这不是一个好主意。在释放指针之前,我总是计算差异(并在必要时将其存储在变量中)