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

using scanf in pointers to integer

提问人:Zip 提问时间:10/5/2023 最后编辑:ChrisZip 更新时间:10/5/2023 访问量:90

问:

该程序测试指针是否可以用作存储输入数据的变量。

#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

c 指针 变量 input scanf

评论

4赞 hobbs 10/5/2023
指针必须指向某物。
3赞 Some programmer dude 10/5/2023
该函数期望指针实际上指向某个位置(有效)。在你的第一个程序中没有指向任何特殊的地方,并且取消引用该指针(确实如此)会导致未定义的行为scanfprtscanf
1赞 Some programmer dude 10/5/2023
在第二个程序中,赋值使指针指向 。p = &xpx
1赞 Some programmer dude 10/5/2023
作为可视化指针的简单方法,拿一张纸并在上面画两个框。给一个盒子贴上标签,给另一个盒子贴上标签。现在从 到 画一个箭头,所以箭头指向 。这基本上就是指针和赋值的工作方式。要可视化第一个示例,请绘制一个框并为其添加标签。现在从那个盒子里画一个箭头,到纸的某个空白处。它显示了如何不指向任何东西。pxpxxp = &xprtprt

答:

4赞 Chris 10/5/2023 #1

你的变量是一个指向 int 的指针,但它实际上并没有使用要指向的有效内存地址进行初始化,因此尝试使用调用未定义的行为读入它。一种可能的结果是分段故障,但不能假定会导致分段故障。prtscanf

您的第二个示例有效,因为确实指向 ,因此我们可以读取它。&xx

3赞 wohlstad 10/5/2023 #2

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

这一行:

int *prt;

声明了指向 的指针,但它未初始化,因此不指向任何有效的 。
结果是未定义的行为 - 任何事情都可能发生,包括(但不一定)分段错误。
prtintint

在第二种情况下:

int x;

x声明为 (不是指向 的指针),因此是 的有效地址。intint&xscanf

旁注:
返回成功解析的字段数。您应该始终检查它(在您的情况下对应 1)以确保它成功。
scanf