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

时间:2015-04-22 10:35:45

标签: 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);

  }

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

2 个答案:

答案 0 :(得分:5)

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

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

 int x; 
 int *nmbrOfUnits = &x;

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

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

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

//...

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

答案 1 :(得分:2)

在您的代码中

 int *nmbrOfUnits = 0;

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

  1. 使用动态内存分配malloc()/calloc()
  2. 示例代码: free()部分省略

    int *nmbrOfUnits = malloc(sizeof(int));
    
     int * input(int *nmbrOfUnits) {
            if (!nmbrOfUnits)
            {
                  exit(-1);
            }
            printf("numnber if units: ");
              scanf(" %d", nmbrOfUnits);
    
            return nmbrOfUnits ;
      } 
    
    1. 分配一些编译时定义变量的地址。
    2. 示例代码:

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

      然后,将其传递给其他函数。