为什么全局指针在此函数中表现不正常?

时间:2019-07-03 17:06:01

标签: c

我试图编写一个使用全局指针来跟踪局部变量的程序,但是当我使用正确的语法时,它不会运行。

当我更改语法时,该程序会产生正确的结果。我不完全了解其背后的机制,希望更多有经验的编码人员可以对此进行解释。谢谢。

#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个指针没有指向任何地方。

更新:它有效!!!!非常感谢你的帮助 :)。

5 个答案:

答案 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)

您的指针没有赋值。