响水凹

欢迎来到 Guang-Wen Duan (Dennis Duan) 的个人 Wiki

用户工具

站点工具


computer:c:tips:invalid_pointer

无效指针的特例

无效指针(invalid pointer)是值不为NULL,但并没有引用一个有效的对象或函数的指针。

任何使用无效指针的操作结果都是未定义的(undefined),可能导致运行时错误(run-time error),保证指针有效性是程序员的责任。

唯一的例外与数组有关:C标准规定了数组最后一个元素之后的那个地址是被定义的,虽然该地址同样是无效的,但可以使用该地址进行一些指针运算。

比如,我们常用的遍历数组代码:

        int array[N];
        int *p;
 
        for (p = array; p < &array[N]; p++) {
        ...
        }

这里&array[N]是无效的(数组最后一个元素地址是&array[N-1])。

更具体的说,指针p与整数k的算术运算p+k或p-k,p必须在上述的数组地址定义范围内(&array[0]~&array[N]),结果指针也必须在该范围内,计算才有意义,否则结果是未定义的(undefined)。

同样,两个指针p和q也必须在上述的同一个数组地址定义范围内,他们的减法p-q才是有意义的。

对于两个指针p和q的关系比较如p<q,除了在同一个数组的地址定义范围内这种情形,也可以是指向同一个struct/union对象的不同内部成员的指针。对struct对象而言,p<q表示q指向的成员在p指向的成员后面定义,而union对象的所有成员的地址都是相同的。

computer/c/tips/invalid_pointer.txt · 最后更改: 2014/11/01 02:02 由 127.0.0.1