提问人:Zip 提问时间:10/5/2023 最后编辑:ChrisZip 更新时间:10/5/2023 访问量:90
在指向整数的指针中使用 scanf
using scanf in pointers to integer
问:
该程序测试指针是否可以用作存储输入数据的变量。
#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
答:
4赞
Chris
10/5/2023
#1
你的变量是一个指向 int 的指针,但它实际上并没有使用要指向的有效内存地址进行初始化,因此尝试使用调用未定义的行为读入它。一种可能的结果是分段故障,但不能假定会导致分段故障。prt
scanf
您的第二个示例有效,因为确实指向 ,因此我们可以读取它。&x
x
3赞
wohlstad
10/5/2023
#2
scanf
(带有 %d)需要有效 int
的地址(以填充解析的字段)。
这一行:
int *prt;
声明了指向 的指针,但它未初始化,因此不指向任何有效的 。
结果是未定义的行为 - 任何事情都可能发生,包括(但不一定)分段错误。prt
int
int
在第二种情况下:
int x;
x
声明为 (不是指向 的指针),因此是 的有效地址。int
int
&x
scanf
旁注:
返回成功解析的字段数。您应该始终检查它(在您的情况下对应 1)以确保它成功。scanf
评论
scanf
prt
scanf
p = &x
p
x
p
x
p
x
x
p = &x
prt
prt