c - 关于指针和内存访问的疑问

标签 c pointers

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

我)

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

上面的代码片段中 (char *) 的用途是什么以及它的含义。

二)

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

这也编译没有任何错误。那么 i 和 ii 代码片段之间有什么区别

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

四)

#define MY_REGISTER (*( volatile 无符号字符*)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));//考虑地址 236632 可用

//堆栈

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

最佳答案

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

  2. 这使得 cptr 指向地址 2345

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

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

关于c - 关于指针和内存访问的疑问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20090030/

相关文章:

c - stdin 上的 read() 返回 EOF 而不是等待输入

c++ - 删除对象

c - C中向链表添加新节点的过程

我可以从 C 函数中获取指向结构体的指针作为参数吗?

c# - 奇怪的引用行为(与 int 相同的内存地址)

c - 释放具有 char 指针的结构数组

c中的组合位和逻辑运算符

c - (作业)如何将一个指针中的 C 字符串放入另一个指针的内存地址中?

c - 如何从 time_t 中提取小时数?

c++ - 如何重构这个 C++ 以删除标签/goto?