首页 > 解决方案 > 使用指针时的意外行为和编译器错误

问题描述

我是 C 新手,几个月来我一直在使用指针并试图弄清楚它们是如何工作的并学习使用它们的语法,但是当编译器抛出错误时我遇到了一个令人困惑的部分, [1] 1473 segmentation fault (core dumped) ./a.out 但我认为代码语法是正确的。

由于我正在使用和学习动态数据结构,很多时候一切看起来都很好,但有时我会遇到一些奇怪的错误,所以我提供了这个使用指针的简单示例,这让我感到困惑。

#include <stdio.h>

int main ()
{
  int *b;
  printf ("Enter some int value -> ");
  scanf ("%d", b);

  printf ("Entered value is: %d", *b);


  return 0;
}

我正在声明一个变量,它是指向内存中整数的指针。由于它在 scanf() 参数中的指针只是该变量的名称,并且当我将其打印到 stdout(printf()) 时,我使用 *b 因为指向指针的指针是该变量的实际值。

标签: cpointersinteger

解决方案


*b没有指向任何地方。尝试这个:

#include <stdio.h>
#include <stdlib.h>
int main ()
{
  int *b = malloc(sizeof(int)); // dynamically allocate memory
  printf ("Enter some int value -> ");
  scanf ("%d", b);

  printf ("Entered value is: %d", *b);
  free(b); // free the dynamically allocated memory
  return 0;
}

或者通过指向堆栈上的变量而不是动态内存分配:

#include <stdio.h>
int main ()
{
  int a;
  int *b = &a;
  printf ("Enter some int value -> ");
  scanf ("%d", b);

  printf ("Entered value is: %d", *b); // or have a instead of *b
  return 0;
}

确保考虑编译器给您的警告。您的代码可能会触发有关使用未初始化的局部变量“b”的警告。如果您没有收到警告,请查看是否可以将编译器配置为更严格。


推荐阅读