C将int *作为参数,参数类型为int **会发生什么?

时间:2016-12-17 17:54:21

标签: c pointers parameter-passing

当我将指针int*作为参数时,参数类型是指针int**的指针会发生什么?

int main(..) {
    int* local_arr = malloc( 10 * sizeof(int) );
    func(local_arr)
}

void func(int** par) {...}

3 个答案:

答案 0 :(得分:2)

在没有显式强制转换的情况下为int *参数传递int **参数是C中的约束违规 .C语言不支持int *的隐式转换值为int **类型。您的程序不是有效的C程序,编译器需要通过诊断消息告诉您。

换句话说,这就是C语言中的“编译错误”。您的程序是“不可编译的”。

即使某些非迂腐的C编译器同意编译该程序,这也不是C程序,并且C语言没有定义代码的行为。

答案 1 :(得分:0)

首先,你至少会得到一个关于它的警告。

但是因为函数会记住保持int **参数,所以可能会出现两次取消引用它的情况,如果你传递int *就会出现问题,从而导致未定义的行为。 此外,在这种情况下,函数体中也会发生类型不匹配。

答案 2 :(得分:0)

如果sizeof(int)等于sizeof(int *),则没有任何事情发生(除了警告),当你想用**推导int **参数时发生错误,如果你用单个*来推断它会发生任何错误都会发生但是,这不是一个好习惯。

void funct(int ** arg){
    printf("%i", (int) *arg);
}

int i = 5;
funct((int **) &arg); // will print 5

另外请注意,它依赖ABI并且可能无法在任何地方使用