【问题标题】:Passing a pointer to scanf() produces segmentation fault将指针传递给 scanf() 会产生分段错误
【发布时间】:2015-04-22 10:35:44
【问题描述】:

这段代码有什么问题?

void input(int *nmbrOfUnits);    

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

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

  }

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

【问题讨论】:

  • 这不是java。 ;-)
  • @2501 - 我应该深拷贝吗:-p
  • 尝试:scanf(" %d", &nmbrOfUnits);函数 scanf 需要一个指向将写入用户输入数据的变量的指针! (这个我说错了……我不看你的代码很好!)
  • @SergioFormiggini , nmbrOfUnits 一个指针。
  • @SergioFormiggini;不,指针指向一个随机位置。

标签: c pointers segmentation-fault


【解决方案1】:

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

 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 );

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      在您的代码中

       int *nmbrOfUnits = 0;
      

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

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

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

      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;
      

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

      【讨论】:

      • 我修好了。让我错了 - 仍然存在分段错误。
      • @java :-) 时间戳对我有利。
      • 不同意投反对票。人们应该查看问题的编辑历史记录。
      • @2501;好的,现在我明白了。
      【解决方案4】:

      您有两个变量,都称为 nmbrOfUnits。这可能会导致您对所指的 var 产生很多混淆。

      如果你想让变量是全局的,正确的写法是:

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

      然后在另一个函数中:

      input(&g_nmbrOfUnits);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多