我刚开始学习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语句显示错误?
答案 0 :(得分:3)
这是类型转换,它告诉编译器将一种类型视为其他(可能不相关)类型。至于结果,见下文第2点。
这会使cptr
指向地址2345
。
现代操作系统隔离了这些过程。一个进程中的一个变量的地址在另一个进程中无效,即使以相同的程序启动也是如此。实际上,由于Address Space Layout Randomisation (ASLR),第二个进程可能具有完全不同的内存映射。
这是因为您尝试写入地址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”初始化指针/分配内存,并在完成作业后“免费”清理。