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

Passing a pointer to scanf() produces segmentation fault

这段代码有什么问题?

void input(int *nmbrOfUnits);    

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

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

  }

编辑:变量是在 main 中创建的,这应该意味着如果 main 调用输入变量不会从堆栈中弹出。为什么要在堆上分配呢? 我传递一个指针并在 scanf 中使用它。为什么我会在这里出现分段错误?

在你的代码中

 int *nmbrOfUnits = 0;

不会使 nmbrOfUnits 指向 有效 内存位置 读取写入。要正确使用,需要先为指针分配内存。您可以通过两种方式做到这一点。

  1. 使用动态内存分配malloc()/calloc()

示例代码:free()部分省略

int *nmbrOfUnits = malloc(sizeof(int));

 int * input(int *nmbrOfUnits) {
        if (!nmbrOfUnits)
        {
              exit(-1);
        }
        printf("numnber if units: ");
          scanf(" %d", nmbrOfUnits);

        return nmbrOfUnits ;
  } 
  1. 分配一些编译时定义变量的地址。

示例代码:

 int variable = 0;
 int *nmbrOfUnits = &variable;

然后,传递给其他函数。

nmbrOfUnits 未初始化,因此指向随机内存位置。写入此类位置可能会导致程序崩溃或运行异常。 在写入之前,您需要先分配内存。

int *nmbrOfUnits = malloc(sizeof(int));

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

 int *nmbrOfUnits = malloc( sizeof( int ) );

 int x; 
 int *nmbrOfUnits = &x;

另一种方法是让函数自己分配指针指向的内存。例如

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

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

//...

int *nmbrOfUnits;
//...
input( &nmbrOfUnits );

您有两个变量,都称为 nmbrOfUnits。这可能会对您指的是哪个变量造成很多混淆。

如果希望变量是全局的,正确的写法是:

int g_nmbrOfUnits;
void input(int *p_nmbrOfUnits) {
    printf("numnber if units: ");  //typos in the original
    scanf("%d", p_nmbrOfUnits);
}

然后在另一个函数中:

input(&g_nmbrOfUnits);