Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C如果将int*作为参数,参数类型为int**,会发生什么?_C_Pointers_Parameter Passing - Fatal编程技术网

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

C如果将int*作为参数,参数类型为int**,会发生什么?,c,pointers,parameter-passing,C,Pointers,Parameter Passing,当我将指针int*作为参数,其中参数类型是指针int**的指针时,会发生什么情况 int main(..) { int* local_arr = malloc( 10 * sizeof(int) ); func(local_arr) } void func(int** par) {...} 首先,你至少会得到一个警告 但由于编写函数时要牢记int**参数,因此可能会出现两次取消引用的情况,如果传递int*,这将是一个问题,从而导致未定义的行为。 此外,在这种情况下,函数体中会

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

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

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

首先,你至少会得到一个警告

但由于编写函数时要牢记
int**
参数,因此可能会出现两次取消引用的情况,如果传递
int*
,这将是一个问题,从而导致未定义的行为。
此外,在这种情况下,函数体中会发生类型不匹配。

首先,您至少会得到一个警告

但由于编写函数时要牢记
int**
参数,因此可能会出现两次取消引用的情况,如果传递
int*
,这将是一个问题,从而导致未定义的行为。 此外,在这种情况下,函数体中会发生类型不匹配。

如果sizeof(int)等于sizeof(int*),则不会发生任何情况(警告除外),错误发生在希望将int**参数与**相一致时,如果将其与single*相一致,则不会发生错误,但这不是一个好的做法

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

int i = 5;
funct((int **) &arg); // will print 5
还要注意的是,它依赖于ABI,可能不适用于任何地方

如果sizeof(int)等于sizeof(int*),则不会发生任何情况(警告除外),错误发生在您希望使用**遵从int**参数时,如果使用single*遵从它,则不会发生错误,但这不是一个好的做法

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

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

还需要注意的是,它依赖于ABI,可能不适用于所有情况

int**
参数传递
int*
参数而不显式转换,这在C语言中是违反约束的。C语言不支持将
int*
值隐式转换为
int**
类型。您的程序不是有效的C程序,编译器需要通过诊断消息告知您

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


即使一些非学究的C编译器同意编译这个程序,这不是C程序,代码的行为不由C语言定义。

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

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


即使某些非学究式的C编译器同意编译此程序,这也不是C程序,代码的行为也不是由C语言定义的。

如果传递的值与声明不匹配,除了从编译器获得严厉警告(如果它允许转换)您将有未定义的行为。如果传递的值与声明不匹配,除了从编译器获得严厉警告(如果它允许转换),您将有未定义的行为。