这个程序测试一个指针是否可以作为一个变量来存储输入数据。
#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
的第一个程序来接受输入?
2条答案
按热度按时间rjzwgtxy1#
你的变量
prt
是一个指向int的指针,但它实际上并没有用一个有效的内存地址初始化为 * pointto *,所以试图用scanf
读取它会引发未定义的行为。一个可能的结果是分段错误,但不能假设会导致分段错误。你的第二个例子是可行的,因为
&x
确实指向x
,所以我们可以读取它。pes8fvy92#
scanf
(带有%d)需要有效int
的地址(以填充解析的字段)。这一行:
声明
prt
为指向int
的a指针,但未初始化,因此未指向任何有效的int
。结果是undefined behavior-任何事情都可能发生,包括(但不一定)分段错误。
在第二个案例中:
x
被声明为int
(不是指向int
的指针),因此&x
是scanf
的有效地址。附带说明:
scanf
返回成功解析的字段数。您应该始终检查它(在您的情况下是1)以确保它成功。