3

当函数参数属于同一类型时,以下代码是否定义良好且可移植?

void foo(int* p, int size);
void pass_on_args_by_pointer(int a, int b, int c)
{
    foo(&a, 3);
}

澄清一下:'size' 参数应该包含数组 p 中元素的数量。所以,我想将所有三个整数都传递给 foo。

4

3 回答 3

7

不,这既不是可移植的,也不是明确定义的。编译器不需要在内存中的相邻位置分配函数参数。事实上,它们根本不需要放置参数bc内存,因为您没有获取它们的地址。任何超出int直通范围p的访问foo都是未定义的行为。

于 2013-08-14T10:45:05.390 回答
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 分配一些值,则需要使用指向指针的指针。

于 2013-08-14T11:21:51.693 回答
-1

即使它可能有效(理论上它应该有效,因为堆栈可以表示为一个数组),您的编译器也没有义务在堆栈上传递参数。例如,它可以使用寄存器来优化您的代码,然后您的代码就会中断。

所以试图以这种方式访问​​另一个函数的参数将是未定义的行为。

于 2013-08-14T11:10:58.243 回答