将指针传递给scanf()会产生分段错误

jav*_*ava 0 c pointers segmentation-fault

这段代码有什么问题?

void input(int *nmbrOfUnits);    

int main() {  
   int *nmbrOfUnits;
   input(nmbrOfUnits);
}

 void input(int *nmbrOfUnits) {
        printf("numnber if units: ");
          scanf(" %d", nmbrOfUnits);

  }
Run Code Online (Sandbox Code Playgroud)

编辑:变量是在main中创建的,这应该意味着如果主调用输入变量没有从堆栈中加载.我为什么要在堆上分配它?我传递一个指针并在scanf中使用它.为什么我在这里遇到分段错误?

Vla*_*cow 5

指针应指向将写入值的内存.例如

 int *nmbrOfUnits = malloc( sizeof( int ) );
Run Code Online (Sandbox Code Playgroud)

要么

 int x; 
 int *nmbrOfUnits = &x;
Run Code Online (Sandbox Code Playgroud)

另一种方法是允许函数本身分配将由指针指向的mamory.例如

void input( int **nmbrOfUnits ) 
{
    *nmbrOfUnits = malloc( sizeof( int ) );

    if ( *nmbrOfUnits != NULL )
    {
        printf( "numnber if units: " );
        scanf( " %d", *nmbrOfUnits );
    }
}

//...

int *nmbrOfUnits;
//...
input( &nmbrOfUnits );
Run Code Online (Sandbox Code Playgroud)