【问题标题】:Seg fault after 2 scanf to pointers2次scanf到指针后的段错误
【发布时间】:2018-08-20 01:27:01
【问题描述】:

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

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

为什么?

【问题讨论】:

  • 指针是数据的地址。指针现在指向哪里?它是否指向正确的内存地址?
  • 您的代码的第一部分不起作用。见coliru.stacked-crooked.com/a/4b4f6f10ed7d4a1a
  • valgrind 是一个了不起的工具,您可以在它下运行您的程序。字面意思就是valgrind ./a.out,它经常会告诉你像这样犯过的简单错误。

标签: c pointers printf scanf


【解决方案1】:

您已经声明了两个指向整数的指针,但从未声明或分配这些指针可能指向的任何内存。相反,在堆栈上声明两个整数,并将指针传递给它们:

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

您的第一个示例可以正常工作的事实完全是运气 - 很可能一个看似有效的指针被留在了堆栈中的正确位置,导致示例几乎无法工作。

【讨论】:

  • 谢谢,我明白了。
【解决方案2】:

它们都不应该工作。如果他们工作,那是因为未定义的行为包括正常工作的行为。

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

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

*(&amp;a) 是不必要的。它的含义与a 完全相同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-10
    • 2013-04-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多