推广指向未定义的地方的指针是否合法?

时间:2014-04-09 13:09:43

标签: c pointers

#include <stdio.h>

void g(int* p, int* q)
{
    *(p + *q) = 2*(*q);
    q++;
}

int main()
{
    int a[6];
    for (int i=0; i<6; i++) {
        g(a,&i);
    }
    for (int i=0; i<6; i++) {
        printf("%d\n", a[i]);
    }
    return 0;
}

提升指向未定义位置的指针是否合法?

我的意思是功能g:代码q++;。这是合法的吗?

3 个答案:

答案 0 :(得分:2)

将单个对象视为1个元素的数组始终是明确定义的。 因此,如果你有:

int i= 0; int* q= &i; q++ /* incrementing once is well-defined */

明确定义q一次增加q。不止一次增加q,并且您有未定义的行为。也就是说,您的C实现可能会对您的代码执行任何操作。它可能会打印错误(某些编译器可以在简单的情况下检测到这种情况),或者它可能产生无声行为的代码,或者它可能产生段错误。

此外,在你将q恰好增加一次之后,它就变成了一个过去的结束指针。使用过去的指针只能做三个明确定义的事情;你可以将它与另一个指向同一个数组的指针进行比较,你可以减少它,你可以复制它。如果访问过去指针所指向的对象,则会得到未定义的行为。

在你的例子中,q在递增之后没有做任何事情;函数只返回,q消失。下次调用时,q用有效值初始化,再次只增加一次。

答案 1 :(得分:0)

如果您要问&#34;在C中是否合法指向我选择的任意地址?&#34;,那么答案是,&#34;是的,它是&#34; s合法C.编译器不会阻止你这样做?&#34;

然而,这是非常不安全的。就像@ user43968在他/她的评论中写道的那样,如果你不小心(即使你小心的话可能会冒险),你也会冒着一个段错的风险。

答案 2 :(得分:0)

在你的代码中,q++所做的就是递增一个指针

在程序的上下文中,此特定行无效,q不会从函数返回,并且在函数之后不会使用

正如user43968在评论中所说,在此增量q指向未定义的位置后,如果修改程序使用它可能会导致错误