给定十六进制格式的文字内存地址,如何在C中创建一个指向此内存位置的指针?
我的平台(IBM iSeries)上的内存地址是128位.C类型long long也是128位.
想象一下,我有一个字符串(char数组)的内存地址,它是: C622D0129B0129F0
我假设正确的C语法直接寻址此内存位置:
const char* const p = (const char* const)0xC622D0129B0129F0ULL
我用ULL后缀表示unsigned long long literal.
我的内核/平台/操作系统是否允许我这样做是一个不同的问题.我首先想知道我的语法是否正确.
我设法得到一个.net对象的地址
GCHandle objHandle = GCHandle.Alloc(obj,GCHandleType.WeakTrackResurrection);
int address = GCHandle.ToIntPtr(objHandle).ToInt32();
Run Code Online (Sandbox Code Playgroud)
我可以通过回忆起这个对象
Object obj = GCHandle.FromIntPtr(IntPtr(address)).Target;
Run Code Online (Sandbox Code Playgroud)
好吧,目的是将地址存储在本机类中,并具有哪个本机对象与哪个.net对象相关联的信息.
AFAIK地址不会因为分配而改变,是真的还是有人有更好的想法来实现我的目的?
谢谢
所以我正在查看我的C编程教科书,我看到了这段代码.
#include <stdio.h>
int j, k;
int *ptr;
int main(void)
{
j = 1;
k = 2;
ptr = &k;
printf("\n");
printf("j has the value %d and is stored at %p\n", j, (void *)&j);
printf("k has the value %d and is stored at %p\n", k, (void *)&k);
printf("ptr has the value %p and is stored at %p\n", (void *)ptr, (void *)&ptr);
printf("The value of the integer pointed to by ptr is %d\n", *ptr);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我跑了它,输出是:
j的值为1,存储在0x4030e0,
k的值为2,存储在0x403100ptr的值为0x403100,存储在0x4030f0 …
什么<function at 'somewhere'>意思?例:
>>> def main():
... pass
...
>>> main
<function main at 0x7f95cf42f320>
Run Code Online (Sandbox Code Playgroud)
也许有办法以某种方式使用它0x7f95cf42f320?
在I/O映射的I/O中(与内存映射的I/O相反),I/O设备固定了一组特定的地址.这些地址是RAM的一部分,因此很多物理地址空间不可用吗?它是否与所附图片中的"硬件保留"内存相对应?
如果是,那么如何确定地址的哪些位用于寻址I/O设备(因为I/O地址空间将比实际存储器小得多.我读过这有助于减少引脚数量/解码电路使用的比特)?
如果试图在汇编中访问属于该地址空间的任何地址,会发生什么?

我正在阅读ECMA-334,正如一位以编程为生的朋友所建议的那样.我在处理不安全代码的部分.虽然,我对他们所谈论的内容感到有点困惑.
C#下面的垃圾收集器可能通过在内存中移动对象来工作,但这种移动对于大多数C#开发人员来说是不可见的.对于通常满足于自动内存管理但有时需要细粒度控制或额外性能的开发人员,C#提供了编写"不安全"代码的能力.这样的代码可以直接处理指针类型和对象地址; 但是,C#要求程序员修复对象以暂时阻止垃圾收集器移动它们.从开发人员和用户的角度来看,这种"不安全"的代码功能实际上是一种"安全"功能.代码中的不安全代码应使用修饰符unsafe清楚地标记,因此开发人员不可能意外地使用不安全的语言功能,并且编译器和执行引擎一起工作以确保不安全的代码不能伪装成安全代码26 8 9BLanguage概述.这些限制将不安全代码的使用限制在代码受信任的情况下.
这个例子
using System;
class Test
{
static void WriteLocations(byte[] arr)
{
unsafe
{
fixed (byte* pArray = arr)
{
byte* pElem = pArray;
for (int i = 0; i < arr.Length; i++)
{
byte value = *pElem;
Console.WriteLine("arr[{0}] at 0x{1:X} is {2}",
i, (uint)pElem, value);
pElem++;
}
}
}
}
static void Main()
{
byte[] arr = new byte[] { 1, 2, 3, 4, 5 };
WriteLocations(arr);
Console.ReadLine();
}
}
Run Code Online (Sandbox Code Playgroud)
在名为WriteLocations的方法中显示一个不安全的块,它修复了一个数组实例,并使用指针操作迭代元素.每个数组元素的索引,值和位置都写入控制台.一个可能的输出示例是:
Run Code Online (Sandbox Code Playgroud)arr[0] at 0x8E0360 is …
这些是我的任务:
编写程序以查找以
nKB为单位的内存中的地址行数.假设n总是2的幂.
样本输入: 2
样本输出: 11
我不需要特定的编码帮助,但我不知道地址线和内存之间的关系.
注意:如果在读完这个问题之后你会想,"怎么会发生这种情况",这没关系.如果你想保持开放的心态,那么在你可以遵循的问题后面有一些要点,这些要点表明了这种情况如何发生以及为什么这有用.请记住,这只是一个问题,而不是任何这些主题的教程.评论已经有足够的噪音,很难遵循.如果您对这些主题有疑问,如果您将其作为问题发布在SO而不是评论中,我将不胜感激.
问题:如果我有一个类型的对象int存储在指向的地址c
int* c = /* allocate int (returns unique address) */;
*c = 3;
Run Code Online (Sandbox Code Playgroud)
由两个指针称为a和b:
int* a = /* create pointer to (*c) */;
int* b = /* create pointer to (*c) */;
Run Code Online (Sandbox Code Playgroud)
这样:
assert(a != b); // the pointers point to a different address
assert(*b == 3);
*a = 2;
assert(*b == 2); // but they refer to the same value
Run Code Online (Sandbox Code Playgroud)
这是未定义的行为吗?如果是,C++标准的哪一部分不允许这样做?如果没有,C++标准的哪些部分允许这样做?
注:记忆c点分配与返回一个唯一的地址(内存分配函数new,malloc …
在C中,当你得到一个变量的地址时,该地址确实存在于计算机的RAM中,或者只是C编译器中假存储器中的地址(如果这是真的有效)?你能用外行的话解释一下吗?
我有一个变量,其地址作为第四个参数传递给setsocketopt。请注意,此参数被声明为常量指针 ( const void *optval)。
在我提交供审查的补丁中,我将该变量的声明更改为 static constexpr。此更改的审阅者对此表示担忧:他认为是否始终可以获取 constexpr 的地址是值得怀疑的。他建议我将其设为常量。在谷歌搜索后,我找不到太多关于 constexpr 变量地址的信息以及对此的担忧。有人可以解释一下与 constexpr 变量的地址有关的保证以及使用它的注意事项(如果有)吗?
如果它有帮助,这里是代码(我添加的static constexpr,这只是int之前的代码):
static constexpr int ONE = 1;
setsockopt(socket_fd, IPPROTO_TCP, TCP_NODELAY, &ONE, sizeof(ONE));
Run Code Online (Sandbox Code Playgroud)
谢谢!