2 scanf到指针后段错误

时间:2018-08-20 01:27:01

标签: c pointers printf scanf

我的头被指针缠住了,我在这段代码上遇到了段错误,没有明显的原因。 基本上可以这样:

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int *a;
    printf("Please enter a number: ");
    scanf("%i", *(&a));
    printf("1st number is: %i\n", *a);
}

这不是:

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int *a, *b;
    printf("Please enter a number: ");
    scanf("%i", *(&a));
    printf("Please enter the second number: ");
    scanf("%i", *(&b));
    printf("1st number is: %i\n", *a);
    printf("2nd number is: %i\n", *b);
}

为什么?

2 个答案:

答案 0 :(得分:4)

您已经声明了两个指向整数的指针,而没有声明或分配这些指针可能指向的任何内存。而是在堆栈上声明两个整数,然后将指针传递给它们:

int a, b;
scanf("%i", &a);
scanf("%i", &b);
printf("Numbers: %i %i\n", a, b);

您的第一个示例可以工作的事实并非出于运气-很有可能在该示例的正确位置将一个看似有效的指针留在了堆栈上,以使该示例几乎无法工作。

答案 1 :(得分:1)

它们都不起作用。如果它们起作用,是因为未定义的行为包括正常工作的行为。

您的主要问题是您正在写入未初始化的指针。我不明白为什么要在这里使用指针。如果需要,您必须使它们指向某个东西。这是一种方法:

int x;
int *a = &x; // Pointer that points to x

或者您可以完全删除指针:

int a;
printf("Please enter a number: ");
scanf("%i", &a);
printf("1st number is: %i\n", a);

不需要*(&a)。它的含义与a完全相同。