怀疑指针和内存访问

时间:2013-11-20 07:37:58

标签: c pointers

我刚开始学习c中的指针。我有几个疑问。如果我找到以下问题的答案。对我来说理解c中指针的概念真的很有用。提前谢谢。

i)个

char *cptr;
int value = 2345;
cptr = (char *)value;

使用(char *)及其在上面的代码片段中的含义。

ii)

char *cptr;
int value = 2345;
cptr = value; 

这也编译没有任何错误。那么i&和ii代码段

iii)&value返回变量的地址。它是RAM中的虚拟内存地址吗?假设另一个并行运行的c程序,该程序可以具有与&value相同的内存地址。每个进程是否可以具有与其他进程相同的重复内存地址,并且它们彼此独立?

iv)

#define MY_REGISTER (*(volatile unsigned char*)0x1234)

void main()
{
    MY_REGISTER=12;
    printf("value in the address tamil  is %d",(MY_REGISTER));
}

以上代码段已成功编译。但它输出分段错误错误。我不知道我在做什么错。我想知道如何使用指针访问随机地址的值。有什么办法吗?程序的地址是否为真实的地址0x1234?

v)printf("value at the address %d",*(236632));//consider the address 236632 available in

//stack

为什么上面的printf语句显示错误?

4 个答案:

答案 0 :(得分:3)

  1. 这是类型转换,它告诉编译器将一种类型视为其他(可能不相关)类型。至于结果,见下文第2点。

  2. 这会使cptr指向地址2345

  3. 现代操作系统隔离了这些过程。一个进程中的一个变量的地址在另一个进程中无效,即使以相同的程序启动也是如此。实际上,由于Address Space Layout Randomisation (ASLR),第二个进程可能具有完全不同的内存映射。

  4. 这是因为您尝试写入地址0x1234,这可能是某些系统上的有效地址,但在大多数系统上都不是,而且几乎从不在运行的地址上运行,例如Windows或Linux。

答案 1 :(得分:1)

i)个

(char *)表示您将value中存储的数据转换为指针ptr,指针指向char。这意味着,ptr指向内存位置2345.在您的代码中,snipet ptr未定义。我想那个节目还有更多。

ⅱ)

不同之处在于,您现在写入cptr,它是(如您定义的)指向char的指针。除了你写一个不同的变量,你使用一个隐式转换,它由编译器解决,没有太大的区别。同样,cptr现在指向位置2345并期望有char

ⅲ)

是的,你可以说它是一个虚拟地址。此外,分割在这个游戏中扮演了一些角色,但在你的舞台上你根本不需要担心它。操作系统将为您解决这个问题,并确保您只覆盖专用于程序的内存空间中的变量。因此,如果您同时运行两次程序,并且打印指针,则很可能是相同的值,但它们不会指向内存中的相同值。

IV)

最初没有看到写入指令。你不能只在任何地方写入内存,因为你可以覆盖另一个程序的值。

v)的

与上述类似的问题。你不能只取消引用你想要的任何数字,首先需要将它转换为指针,否则编译器,你的操作系统和你的CPU都不会有任何线索,它指向的是什么

希望我可以帮助你,但我建议你在一些关于C语言指针的书中再次潜水。

答案 2 :(得分:0)

i。)Type cast,将整数转换为char

ii。)你指的是2345的地址。

iii。)参考Joachim Pileborg的回答。 ^ ASLR

iv。)如果不知道是否存在某些内容,您就不能直接写入地址。

v。)因为您实际上是使用指针打印正常的整数输出,这应该抛出错误C2100: illegal indirection

答案 3 :(得分:0)

你可能会认为指针就像邮箱上的数字一样。当你为一个指针设置一个值时,例如cptr = 2345就像你在邮箱2345前移动一样。没关系,没有与内存的实际交互,因此没有崩溃。当您说出类似* cptr的内容时,这指的是实际的“邮箱内容”。为* cptr设置一个值就像试图在你面前的邮箱中放置一些东西(内存位置)。如果您不知道它属于谁(应用程序如何使用该内存),那可能是个坏主意。您可以使用“malloc”初始化指针/分配内存,并在完成作业后“免费”清理。