当函数参数属于同一类型时,遵循定义良好且可移植的代码吗?
void foo(int* p, int size);
void pass_on_args_by_pointer(int a, int b, int c)
{
foo(&a, 3);
}
要清除:'尺寸'参数应包含数组p中的元素数。所以,我想将所有三个整数传递给foo。
答案 0 :(得分:7)
不,这既不便携也不明确。编译器不需要在内存中的相邻位置分配函数参数。事实上,他们不需要将参数b
和c
放在内存中,因为您没有使用他们的地址。超出int
中p
到foo
范围内的任何访问都是未定义的行为。
答案 1 :(得分:0)
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分配一些值,则需要使用指针指针。
答案 2 :(得分:-1)
即使它可能会工作(理论上,它应该,因为堆栈可以表示为数组),您的编译器没有义务在堆栈上传递参数。例如,它可以使用寄存器来优化代码,然后代码就会中断。
因此尝试以这种方式访问另一个函数的参数将是未定义的行为。