在指向整数的指针中使用scanf

carvr3hs  于 2023-10-16  发布在  其他
关注(0)|答案(2)|浏览(135)

这个程序测试一个指针是否可以作为一个变量来存储输入数据。

#include <stdio.h>

int main(void)
{
    int *prt;
    printf("Input prt:");
    scanf("%d", prt);
    printf("What you inputed is: %d\n", *prt);
    return 0;
}

还有测试日志:

Segmentation fault (core dumped)

然后我写了另一个测试:

#include <stdio.h>

int main(void)
{
    int *p;
    int x;
    printf("Input x:");
    scanf("%d", &x);
    p = &x;
    printf("What you inputed is: %d\n", x);
    printf("What you inputed is: %d\n", *p);
    printf("The address of x: %p\n", &x);
    printf("The address p points to: %p\n", p);

    return 0;   
}

还有测试日志:

Input x:10
What you inputed is: 10
What you inputed is: 10
The address of x: 0x7ffc5f2636f4
The address p points to: 0x7ffc5f2636f4

效果很好。所以我很困惑,为什么我不能使用prt的第一个程序来接受输入?

rjzwgtxy

rjzwgtxy1#

你的变量prt是一个指向int的指针,但它实际上并没有用一个有效的内存地址初始化为 * pointto *,所以试图用scanf读取它会引发未定义的行为。一个可能的结果是分段错误,但不能假设会导致分段错误。
你的第二个例子是可行的,因为&x确实指向x,所以我们可以读取它。

pes8fvy9

pes8fvy92#

scanf(带有%d)需要有效int地址(以填充解析的字段)。
这一行:

int *prt;

声明prt为指向int的a指针,但未初始化,因此未指向任何有效的int
结果是undefined behavior-任何事情都可能发生,包括(但不一定)分段错误。
在第二个案例中:

int x;

x被声明为int(不是指向int的指针),因此&xscanf的有效地址。
附带说明:
scanf返回成功解析的字段数。您应该始终检查它(在您的情况下是1)以确保它成功。

相关问题