#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++;
。这是合法的吗?
答案 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
指向未定义的位置后,如果修改程序使用它可能会导致错误