声明指向内存中地址0x200的整数的指针

时间:2012-10-21 20:08:22

标签: c memory pointers

我有几个疑问,我记得有些地方,我不可能手动将变量放在内存中的特定位置,但后来我遇到了这段代码

#include<stdio.h>
void main()
{
int *x;
x=0x200;
printf("Number is %lu",x); // Checkpoint1
scanf("%d",x);
printf("%d",*x);
}

是否我们无法将其放在特定位置,或者我们不应将其放在特定位置,因为我们不知道它是否是有效位置?

此外,在此代码中,直到第一个checkopoint,我输出为512。 之后就是Seg Fault。

有人可以解释原因吗? 0x200不是有效的内存位置吗?

3 个答案:

答案 0 :(得分:3)

在一般情况下 - 您将获得的行为未定义 - 一切都可能发生。

在linux中,例如,第一个1GB是为内核保留的,所以如果你试图访问它 - 你会遇到一个seg错误,因为你试图在用户模式下访问内核内存。

不知道它在windows中是如何工作的。


Reference for linux claim

  

目前32位x86架构是最受欢迎的类型   电脑。在这种架构中,传统上Linux内核具有   将4GB的虚拟内存地址空间分成3GB用户   程序和内核1GB。

答案 1 :(得分:0)

添加@amit写的内容:

在Windows中它是一样的。通常,对于所有保护模式操作系统,它都是相同的。由于DOS等不再存在,除了内核模式(km-drivers)和嵌入式系统之外,所有系统都是如此。

操作系统管理允许写入的内存页面,并放置标记,如果写入其他页面,将使cpu自动引发访问冲突。

答案 2 :(得分:0)

直到“检查点”,你还没有访问内存位置0x200,所以一切正常。

我在函数x中有一个局部变量main。它的类型是“指向int的指针”。 x被赋值为0x200,然后打印该值。但是x的目标尚未被访问,所以到目前为止x是否包含有效的内存地址并不重要。

然后scanf尝试写入您传入的内存地址,即存储在x中的0x200。然后你得到一个seg错误,这肯定是试图写入任意内存地址的可能结果。

那你有什么疑问?是什么让你觉得这可能有用,当你遇到这个明显没有的代码时?

写入特定的内存地址可能在某些条件下工作,但一般情况下极不可能。在所有现代操作系统下,普通程序无法控制其内存布局。操作系统决定程序代码,堆栈和全局变量之类的初始位置。操作系统可能也会使用一些内存空间,并不需要告诉你它的用途。相反,你要求记忆(通过变量或通过调用内存分配例程),并使用它。

因此,写入特定地址很可能会获得尚未分配的内存或用于其他目的的内存。即使你设法找到一个实际可写的地址,这些都不好。如果您破坏了某个程序的其他变量所使用的某些数据,该怎么办?或者你的程序的其他部分破坏了你刚写的价值?

你永远不应该选择一个特定的硬编码内存地址,你应该使用你知道的变量地址,或者malloc之类的地址。