【问题标题】:C what happens putting int* as parameter where parameter type is int**?C将int *作为参数类型为int **的参数会发生什么?
【发布时间】:2016-12-17 17:54:20
【问题描述】:

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

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

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

【问题讨论】:

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

标签: c pointers parameter-passing


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      如果 sizeof(int) 等于 sizeof(int*),则不会发生任何事情(警告除外),当您想用 ** 尊重 int** 参数时发生错误,如果您用单个 * 尊重它,则不会发生任何错误,但这不是一个好习惯。

      void funct(int ** arg){
          printf("%i", (int) *arg);
      }
      
      int i = 5;
      funct((int **) &arg); // will print 5
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-06-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-09
        • 2021-12-12
        • 2019-02-27
        相关资源
        最近更新 更多