当函数参数属于同一类型时,以下代码是否定义良好且可移植?
void foo(int* p, int size);
void pass_on_args_by_pointer(int a, int b, int c)
{
foo(&a, 3);
}
澄清一下:'size' 参数应该包含数组 p 中元素的数量。所以,我想将所有三个整数都传递给 foo。
不,这既不是可移植的,也不是明确定义的。编译器不需要在内存中的相邻位置分配函数参数。事实上,它们根本不需要放置参数b
和c
内存,因为您没有获取它们的地址。任何超出int
直通范围p
的访问foo
都是未定义的行为。
void foo(int** p, int size)
{
**p = size;
return;
}
void pass_on_args_by_pointer(int *a, int b, int c)
{
foo(&a, 3);
}
int main(void)
{
int a = 0;
pass_on_args_by_pointer(&a, 0, 0);
printf("a = %d", a);
}
如果要为变量 a 分配一些值,则需要使用指向指针的指针。
即使它可能有效(理论上它应该有效,因为堆栈可以表示为一个数组),您的编译器也没有义务在堆栈上传递参数。例如,它可以使用寄存器来优化您的代码,然后您的代码就会中断。
所以试图以这种方式访问另一个函数的参数将是未定义的行为。