让我说我有这个变量:
...
Somekindofobject var = new Somekindofobject();
...
Run Code Online (Sandbox Code Playgroud)
我想知道var在堆上的位置(通过地址,如0x08等),并打印出地址.
可能吗?
我知道它使用物理地址=段寄存器<< 4 +偏移寄存器.虽然这两个寄存器是16位,8086如何处理20位加法操作?
我有一个类来表示浮动的3D矢量:
class Vector3D
{
public:
float x, y, z;
float * const data;
Vector3D() : x(0.0), y(0.0), z(0.0), data(&x) {}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:x,y和z是否会在内存中顺序分配,这样我就可以将x的地址分配给数据,然后使用数据上的下标运算符来作为数组访问矢量组件?
例如,有时我可能想直接访问矢量组件:
Vector3D vec;
vec.x = 42.0;
vec.y = 42.0;
vec.z = 42.0;
Run Code Online (Sandbox Code Playgroud)
有时我可能想通过偏移来访问它们:
Vector3D vec;
for (int i = 3; i--; )
vec.data[i] = 42.0;
Run Code Online (Sandbox Code Playgroud)
第二个示例是否与第一个示例具有相同的效果,或者我是否存在覆盖除x,y和z浮点数以外的内存的风险?
我反汇编了一个DLL并看到了一些函数.我找到了我需要的功能,它的地址是0x10001340.
如果我将这个dll加载到我的应用程序中,这个地址是否会保持不变?那么我可以通过我的应用程序中的地址调用该函数吗?
我问,因为我不确定:如果加载此dll时,主应用程序中的某些功能已经具有相同的地址?所以也许dll中的函数可以在加载等时更改地址.
我想知道是否有可能做这样的事情:
unsigned int address = 0x0001FBDC; // Random address :P
int value = *address; // Dereference of address
Run Code Online (Sandbox Code Playgroud)
意思是,是否可以在内存中获取特定地址的值?
谢谢
在搜索了整个互联网以找到一种方式来表示我从Apple收到的崩溃日志之后,我终于想出了如何在终端中使用atos命令来表示崩溃日志.我有dSYM文件,.app文件和崩溃日志在同一个文件夹中,使用atos -arch armv7 -o APPNAME我已经能够输入内存地址,有时(但很少)一个方法名称出现了.说实话,我对终端或崩溃日志没有多少经验.不幸的是,试图用Xcode的组织者来表示崩溃日志已经完全没有了,并且尝试symbolicatecrash在Xcode的包内容中使用该文件也失败了.所以我在这里,留下了我所知道的唯一其他选择.
现在,我的问题是:如何制作这些内存地址的正面或反面?我必须输入哪些地址才能到达应用程序崩溃的位置?我90%的方式在那里,我只是不知道哪些地址会给我有价值的信息或哪些是无用的.这里附有一张崩溃日志的图片:

任何帮助是极大的赞赏.
假设我有一个矢量类:
typedef struct vec3_s
{
float x, y, z;
}
vec3;
Run Code Online (Sandbox Code Playgroud)
但是,我希望能够迭代它而不将其转换为浮点数组.虽然在这种情况下演员阵容是可以接受的,但我很想知道C++中的任何功能是否都可以在C语言中完成.例如,在C++中,由于std::vector< T >下标[]运算符被重载,我可以传递其地址一个函数的第一个索引void*.
即
void do_something_with_pointer_to_mem( void* mem )
{
// do stuff
}
int main( void )
{
std::vector< float > v;
// fill v with values here
// pass to do_something_with_pointer_to_mem
do_some_with_pointer_to_mem( &v[ 0 ] );
return;
}
Run Code Online (Sandbox Code Playgroud)
另一个更具体的例子是在OpenGL中使用glBufferData(...)时(使用C++时):
glBufferData( GL_ARRAY_BUFFER, sizeof( somevector ), &somevector[ 0 ], GL_STREAM_DRAW );
那么,是否有可能使用下标运算符在C中完成类似的事情?如果没有,并且我必须编写一个函数(例如float vec3_value_at( unsigned int i )),那么static inline …
我正在回答这本教科书中的教科书问题.
我正在学习C中的指针,并且遇到了l值和r值.根据我的理解:
l-values are values that are defined after they are executed (++x)
r-values are values that are not defined after they are executed (x++)
Run Code Online (Sandbox Code Playgroud)
这是正确的吗?
我想回答的问题(我的尝试):
a) Which of the following C expressions are L-Values?
1. x + 2 Not a L value
2. &x Is a L value
3. *&x Is a L value
4. &x + 2 Not a L value
5. *(&x + 2) Is a L value
6. &*y Is a L value …Run Code Online (Sandbox Code Playgroud) 我正在阅读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 …
让我们MOV EAX,[0xFFFFFFFF]以64位模式将指令编码为67A1FFFFFFFF(有效地址大小由67前缀从默认的64位切换为32位)。
英特尔指令参考手册(从2015年12月起,文档订购号:325383-057US)在第Vol。2A 2-11说:
2.2.1.3
64位模式下的位移寻址使用现有的32位ModR / M和SIB编码。ModR / M和SIB大小不变。它们保留为8位或32位,并被符号扩展为64位。
这表明应该对32bit位移进行符号扩展,但是我不确定这是否也涉及特殊的moffs寻址模式。英特尔在下一页上说:
2.2.1.6 RIP相对寻址
RIP相对寻址是通过64位模式而不是64位地址大小启用的。地址大小前缀的使用不会禁用RIP相对寻址。地址大小前缀的作用是将计算的有效地址截断并将其零扩展为32位。
这表明在相对寻址模式下,将disp32符号扩展到64位,再添加到RIP,然后截断并进行零扩展。但是,我不确定同一规则是否适用于绝对寻址模式,MOV moffs操作就是这种情况。
从A)FFFFFFFFFFFFFFFF或B)00000000FFFFFFFF将EAX加载到哪个地址?