[英]Doubts about pointer and memory access
我刚刚开始学习c中的指针。 我有以下疑问。 如果我找到以下问题的答案。 对我来说,理解c中的指针的概念将非常有用。 提前致谢。
一世)
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语句显示错误?
这是类型转换 ,它告诉编译器将一种类型视为其他某种类型(可能不相关)。 至于结果,请参阅下面的第2点。
这使cptr
指向地址2345
。
现代操作系统将进程隔离。 即使在同一程序中启动,一个进程中一个变量的地址在另一进程中也无效。 实际上,由于地址空间布局随机化(ASLR) ,第二个过程可能具有完全不同的内存映射。
这是因为您尝试写入地址0x1234
,该地址在某些系统上可能是有效地址,但在大多数系统上却不是,并且几乎永远不会在运行Windows或Linux的PC上。
一世)
(char *)
表示将value
存储的数据转换为指针ptr
,该指针指向char
。 这意味着,该ptr
指向内存位置2345。在您的代码中,snipet ptr
是未定义的。 我想该程序还有更多功能。
II)
区别在于,您现在要写入cptr,它是(按定义)指向char
的指针。 与i)一样,没有什么区别,只是您写了一个不同的变量,并且使用了隐式强制转换,由编译器解析。 再次,cptr现在指向位置2345,并期望有一个char
三)
是的,您可以说这是一个虚拟地址。 细分在该游戏中也扮演着某些角色,但是在您的阶段,您根本无需担心。 操作系统将为您解决该问题,并确保仅覆盖程序专用存储空间中的变量。 因此,如果您同时运行两次程序并打印一个指针,则该指针很可能具有相同的值,但它们不会指向内存中的相同值。
IV)
起初没有看到写指令。 您不能随便写任何内容到内存,因为您可能会覆盖另一个程序的值。
v)
与上述类似的问题。 您不能只取消引用所需的任何数字,首先需要将其强制转换为指针,否则编译器,您的OS或您的CPU都不会知道它到底指向什么
希望我能为您提供帮助,但我建议您再次参加一些有关C指针的书籍。
i。) 键入cast ,将整数转换为char
ii。)您指向2345的地址。
iii。)请参阅Joachim Pileborg的回答。 ^ ASLR
iv。)在不知道/甚至是否存在某物的情况下,您无法直接写入该地址。
v。)因为您实际上是在使用指针打印正常的整数,所以应该抛出错误C2100: illegal indirection
。
您可能会认为指针就像邮箱上的数字一样。 当您为指针设置一个值时,例如cptr = 2345就像您移到邮箱2345的前面。没关系,没有与内存的实际交互,因此没有崩溃。 当您声明* cptr之类的内容时,它指的是实际的“邮箱内容”。 设置* cptr的值就像尝试将某些东西放在您面前的邮箱中(内存位置)。 如果您不知道它属于谁(应用程序如何使用该内存),则可能不是一个好主意。 您可以使用“ malloc”初始化指针/分配内存,并使用“ free”完成作业后进行清理。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.