我试图编写一个使用全局指针来跟踪局部变量的程序,但是当我使用正确的语法时,它不会运行。
当我更改语法时,该程序会产生正确的结果。我不完全了解其背后的机制,希望更多有经验的编码人员可以对此进行解释。谢谢。
#include <stdio.h>
#include <math.h>
int *q;
int *u;
int *p;
void test () {
printf("Insert #1?\t"); scanf("%d", &u);
/*should be scanf("%d", u) for u is a pointer*/
printf("Insert #2?\t"); scanf("%d", &p);
/*should be scanf("%d", p) for p is a pointer*/
}
int main () {
test ();
printf("%d\n", u);
/*should be printf("%d\n", *u) since I am trying to dereference the value of u*/
printf("%d\n", p);
printf("%d\n", q);
}
输出应该是3个数字,第2个是用户输入的数字,第3个应该是无意义的数字,因为第3个指针没有指向任何地方。
更新:它有效!!!!非常感谢你的帮助 :)。
答案 0 :(得分:3)
这与全局变量无关。这里有多个问题,但是最紧迫的错误是您试图使用未初始化的指针。 这永远行不通。您需要先了解指针,然后才能正确使用它们。
尤其是如果您有这样的声明:
int *x;
然后,无论您做什么,您都首先需要为x
1 分配一个有效的指针。
对于您而言,错误是由于您使用scanf
错误而加剧的。幸运的是,这里的解决方案非常简单:不要声明指针。而是声明int
变量。
#include <stdio.h>
int q;
int u;
int p;
void test () {
printf("Insert #1?\t"); scanf("%d", &u);
printf("Insert #2?\t"); scanf("%d", &p);
}
int main () {
test();
printf("%d\n", u);
printf("%d\n", p);
printf("%d\n", q);
}
具有讽刺意味的是,原始代码中的注释已经指出了问题,它们只是提出了错误的解决方案。这些评论的来源有点神秘。 ;-)
1 从技术上讲,唯一的例外是静态分配的指针,该指针已正确初始化为零,因此可用于空指针比较。
答案 1 :(得分:1)
指针需要指向某个内容,例如另一个变量或使用malloc()
动态分配的内存。
您不能使用scanf()
直接读入指针。您可以使用它来读取指针指向的内容。
因此您可以编写如下内容:
#include <stdio.h>
#include <math.h>
int q;
int *qp = &q;
int *up;
int p;
int *pp = &p;
void test () {
printf("Insert #1?\t"); scanf("%d", up);
printf("Insert #2?\t"); scanf("%d", pp);
}
int main () {
up = malloc(sizeof(*up));
test ();
printf("%d\n", *up);
printf("%d\n", p);
printf("%d\n", q);
}
答案 2 :(得分:1)
正如我在对该问题的评论中所说,指针是一种类型,用于保存某个类型的另一个变量的地址,因此int*
持有一个类型为int
的变量的地址。在您的情况下,&u
指的是u
的地址,因此您试图将数字扫描到指针中而无法使用。您应该将其更改为仅u
,这样它也将扫描到它指向的变量,但是它首先需要指向一个有效的变量。这是一个有效的示例:
int someNumber = 5;
int* u = &someNumber; // u points to a valid address statically allocated
scanf("%d", u); // Scans the number inputed to someNumber because u points to it
getchar(); // Avoid buffer overflow
printf("%d\n", *u); // A * dereferences u - gets the value of the variable it's pointing to
答案 3 :(得分:0)
您的全局变量是指向int的指针,而不是int本身。读取值时,将更改内存u
指向的位置,而不是u
的值。
您应将其替换为scanf("%d", u);
或将声明更改为int u
。
您需要小心从用户那里获取指针值。否则,您可能会冒空指针解引用之类的风险。例如,在您0
时输入scanf("%d", &u);
,它将使u
的值为NULL
。
答案 4 :(得分:0)
您的指针没有赋值。