繁体   English   中英

关于指针和内存访问的怀疑

[英]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语句显示错误?

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

  2. 这使cptr指向地址2345

  3. 现代操作系统将进程隔离。 即使在同一程序中启动,一个进程中一个变量的地址在另一进程中也无效。 实际上,由于地址空间布局随机化(ASLR) ,第二个过程可能具有完全不同的内存映射。

  4. 这是因为您尝试写入地址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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM