printf 返回 6422044 作为变量的值

printf returning 6422044 for the value of variable

问题

基本上,我有一个简单的 C 代码来 return 变量的值,但是,如果我更改 scanf()& 和 [=33] 的 printf =]ed 变量的值已更改。这个事件的技术解释是什么?

(输入: 3) printf returning: 3

#include <stdio.h>
#include <stdlib.h>

void main(){
    int x = 1;
    scanf("%d", &x);
    printf("%d", x);
}

(输入: 3) printf returning: 6422044

#include <stdio.h>
#include <stdlib.h>

void main(){
    int x = 1;
    scanf("%d", &x);
    printf("%d", &x);
}

(输入:3)printf returning:(无)

#include <stdio.h>
#include <stdlib.h>

void main(){
    int x = 1;
    scanf("%d", x);
    printf("%d", &x);
}

第一个代码很简单。您将值存储在 x 的地址中,因此您提到 &x 并且您可以通过 x 访问该值。

在第二个代码中,您获得了我上面提到的值。在 printf 语句中,您正在打印 x.

的地址

基本上&指的是地址你在学习概念的时候会看到很多Pointer.

使用 printf("%d", &x);,您传递 x 的地址,其中 printf 需要 int。当您这样做时,C 标准没有定义行为。一个常见的结果是该地址或其中的一部分被解释为 int 并打印出来,因此 6422044 可能是内存中 x 地址的一部分。

使用 scanf("%d", x);,您传递 xint 值,1,其中 scanf 需要 int 的地址。当您这样做时,C 标准没有定义行为。一个常见的结果是 int 被重新解释为地址并且 scanf 尝试写入该地址。地址 1 可能未映射为您的进程可访问,从而导致您的进程终止。这将导致进程没有输出,并且还应该导致一些关于程序终止的错误消息。如果您在 IDE 中执行程序,您可能会错过这个。

只需将 printf("%d", &x); 中的 & 删除,它一定会解决您的问题。