我的头被指针缠住了,我在这段代码上遇到了段错误,没有明显的原因。 基本上可以这样:
#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);
}
为什么?
答案 0 :(得分:4)
您已经声明了两个指向整数的指针,而没有声明或分配这些指针可能指向的任何内存。而是在堆栈上声明两个整数,然后将指针传递给它们:
int a, b;
scanf("%i", &a);
scanf("%i", &b);
printf("Numbers: %i %i\n", a, b);
您的第一个示例可以工作的事实并非出于运气-很有可能在该示例的正确位置将一个看似有效的指针留在了堆栈上,以使该示例几乎无法工作。
答案 1 :(得分:1)
它们都不起作用。如果它们起作用,是因为未定义的行为包括正常工作的行为。
您的主要问题是您正在写入未初始化的指针。我不明白为什么要在这里使用指针。如果需要,您必须使它们指向某个东西。这是一种方法:
int x;
int *a = &x; // Pointer that points to x
或者您可以完全删除指针:
int a;
printf("Please enter a number: ");
scanf("%i", &a);
printf("1st number is: %i\n", a);
不需要*(&a)
。它的含义与a
完全相同。