c - 2 次 scanf 到指针后出现段错误

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

为什么?

最佳答案

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

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

您的第一个示例能够工作的事实纯粹是运气 - 很可能一个看似有效的指针留在了堆栈上的正确位置,导致该示例几乎无法工作。

关于c - 2 次 scanf 到指针后出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51923130/

相关文章:

c - 在 C 中使用 libgcrypt 导出 key

c++ - stringstream 的第一个字符串参数被保存为指针/垃圾

c - printf with %a 似乎不会产生十六进制数

java - 使用另一个C/Java程序从给定的C++/Java程序中提取信息

c - 从源构建期望(静态链接)

c - C 中的范围和条件#define

c - 循环求和给出意想不到的结果

c - 使用 char* a[] 与 char a[][]

找不到 "Too many arguments for format"的问题

c - 每当我执行该程序时,它最后都会接受不需要的额外输入