当我将指针int*
作为参数时,参数类型是指针int**
的指针会发生什么?
int main(..) {
int* local_arr = malloc( 10 * sizeof(int) );
func(local_arr)
}
void func(int** par) {...}
答案 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并且可能无法在任何地方使用