标签: memory-address

Java引用值是地址值?

当我做:

int x[] = new int[2];
System.out.println("...> " + x);
Run Code Online (Sandbox Code Playgroud)

输出值如下: [I@1b67f74

以便十六进制数与已分配对象的内存地址有关?

并且[I这是什么意思?

java pointers reference memory-address

2
推荐指数
1
解决办法
1081
查看次数

在Delphi中通过其内存地址调用可变参数C函数

假设我在C++中有一个函数,我在其中使用指向其内存地址的指针来调用它typedef.现在,我怎样才能在Delphi中做同样的事情?

例如:

typedef void (*function_t)(char *format, ...);
function_t Function;
Function = (function_t)0x00477123;
Run Code Online (Sandbox Code Playgroud)

然后,我可以用:Function("string", etc);.

在Delphi中,有没有办法在不使用汇编指令的情况下执行此操作?

请注意,它是一个可变参数函数.

delphi typedef variadic-functions memory-address

2
推荐指数
1
解决办法
1918
查看次数

什么是C中的vuint,为什么它在我的微控制器中?

我正在翻阅微控制器的一些C头文件,我一直看到寄存器地址初始化为vuint.我之前没有遇到过这种数据类型,所以我做了一些搜索,没有真正的结果.我得到的最接近的是/sf/answers/899919261/,它告诉我v代表"volatile".所以,我有挥发无符号的整数,持有硬件寄存器地址.就像在,我有一个数据类型明确指出"这个地址可能会发生变化",代表硬连线的寄存器,并且不能像以前那样改变.我对vuint的理解不正确吗?如果没有,为什么我们这样代表地址?

c microcontroller types volatile memory-address

2
推荐指数
1
解决办法
1549
查看次数

如何确定变量是动态增加还是减少/检测变化

所以,我试图找出,如何确定我的变量是否正在增加它的价值,或者减少它.我知道我可以使用一个变量来存储旧值,但在这种情况下它不是一个选项.

int variable = 0;
variable = 1;
if(variable has increased) {
      //Do Magic stuff
}
Run Code Online (Sandbox Code Playgroud)

基本上,我会怎么想这样做.我不知道是否有可能这样,没有旧值的容器,但我认为可能有一个C#函数,可以解决这个问题,可能是一个内存地址?

我还没有得到任何线索,这种方法或技术也被称之为,所以对此也很了解.

c# math variables memory-address

2
推荐指数
1
解决办法
1480
查看次数

使用gdb和objdump进行调试

我有很多关于gdb和objdump的问题.

objdump中的地址

如果我这样做:objdump -d binary-file-name,那么我得到包含这部分的输出:

Disassembly of section .text:

080484a0 <_start>:
 80484a0:   31 ed                   xor    %ebp,%ebp
 80484a2:   5e                      pop    %esi
 80484a3:   89 e1                   mov    %esp,%ecx
Run Code Online (Sandbox Code Playgroud)

我假设第一列中的这些数字是地址?但是我不明白这些地址是如何知道的,因为当一个进程被加载时它被放在内存中的一个随机位置,这意味着代码每次都有不同的地址?或者这些地址是相对于进程'地址空间?

<_start>下列出的值是什么?

GDB逐步执行代码

我有一个二进制文件,其中没有源代码.我想逐步完成该程序,但没有符号信息.我无法在功能名称或亚麻布上设置断点.我试图在地址上设置一个断点,这很有效,但我无法弄清楚如何逐步完成该程序.当我这样做:(gdb)s或(gdb)n它说它没有行信息,只运行整个函数.有没有办法逐步完成它,或逐步完成装配说明?

assembly gdb objdump memory-address

2
推荐指数
1
解决办法
7746
查看次数

&"string"与"string"的地址相同吗?

我有一些生成的C代码,如下所示:

char *example[] = {&" ",&"\n", &"\t"};
Run Code Online (Sandbox Code Playgroud)

如果我自己写这个,我会丢掉&符号(&),因为字符串文字已经是类型char *.对我来说,看起来example 应该已经生成声明为char**[].

我可以确定指针是否与&s 相同?这是否取得了C中定义好的地址?

编辑:我正在调查当前生命周期中某些不接受任何更改的软件的警告.是否printf("%p", &"hello world");总是一样的printf("%p", "hello world");,还是这依赖于编译器?

c string c-strings memory-address

2
推荐指数
1
解决办法
103
查看次数

指向层次结构中类的指针的相等性

#include <iostream>

class A
{
public:
    A() : m_i(0) { }

protected:
    int m_i;
};

class B
{
public:
    B() : m_d(0.0) { }

protected:
    double m_d;
};

class C
    : public A
    , public B
{
public:
    C() : m_c('a') { }

private:
    char m_c;
};

int main()
{
    C c;
    A *pa = &c;
    B *pb = &c;

    const int x = (pa == &c) ? 1 : 2;
    const int y = (pb == &c) ? 3 …
Run Code Online (Sandbox Code Playgroud)

c++ inheritance pointers class memory-address

2
推荐指数
1
解决办法
200
查看次数

为什么在NASM中使用相对RIP寻址?

我有一个适用于Mac OS X的程序集hello world程序,如下所示:

global _main


section .text

_main:
    mov rax, 0x2000004
    mov rdi, 1
    lea rsi, [rel msg]
    mov rdx, msg.len
    syscall

    mov rax, 0x2000001
    mov rdi, 0
    syscall


section .data

msg:    db  "Hello, World!", 10
.len:   equ $ - msg
Run Code Online (Sandbox Code Playgroud)

我想知道这条线lea rsi, [rel msg]。为什么NA​​SM强迫我这样做?据我了解,它msg只是指向可执行文件中某些数据的指针,这样做mov rsi, msg会将地址放入rsi。但是,如果我将替换为lea rsi, [rel msg],则NASM会引发此错误(注意:我使用的是命令nasm -f macho64 hello.asm):

hello.asm:9: fatal: No section for index 2 offset 0 found
Run Code Online (Sandbox Code Playgroud)

为什么会这样?有什么特别之处leamov …

assembly nasm cpu-registers memory-address mov

2
推荐指数
2
解决办法
3874
查看次数

在正在运行的进程中给出其地址,在可执行文件中查找指令?

我正在修改一个旧的放弃软件游戏,以获得无限生命.

具有该指令的地址dec ecx与其在.exe调试中的位置不同.

我记得我的一位老朋友告诉我,有一个公式可以通过.exe中的指令获得"真实"地址.作弊引擎给了我内存地址.我记得在数学公式中,我需要得到模块,在OllyDbg我得到它.但我不记得这个公式.有人知道那个数学公式怎么样?这个公式非常简单!还有另一种方法可以让文件位置永久修改.exe吗?

assembly reverse-engineering memory-address portable-executable cheat-engine

2
推荐指数
1
解决办法
2426
查看次数

如何处理Ada中的int **?

我正在尝试使用对它来自的C库的预先绑定来调用SDL_LoadWAV。SDL_LoadWAV只是SDL_LoadWAV_RW的包装:

function SDL_LoadWAV
 (file      : C.char_array;
  spec      : access SDL_AudioSpec;
  audio_buf : System.Address;
  audio_len : access Uint32) return access SDL_AudioSpec
is
begin
  return SDL_LoadWAV_RW
      (SDL_RWFromFile (file, C.To_C ("rb")),
       1,
       spec,
       audio_buf,
       audio_len);
end SDL_LoadWAV;
Run Code Online (Sandbox Code Playgroud)

这是C函数的原型:

SDL_AudioSpec* SDL_LoadWAV_RW(SDL_RWops*     src,
                          int            freesrc,
                          SDL_AudioSpec* spec,
                          Uint8**        audio_buf,
                          Uint32*        audio_len)
Run Code Online (Sandbox Code Playgroud)

(浏览此处获取更多信息)

现在您可以看到,它以Uint8 **的形式通过引用传递了一个Uint8(无符号8位整数)数组。这使我非常烦恼。这是适当的绑定:

function SDL_LoadWAV_RW
 (src       : access SDL_RWops;
  freesrc   : C.int;
  spec      : access SDL_AudioSpec;
  audio_buf : System.Address;
  audio_len : access Uint32) return access SDL_AudioSpec;
pragma Import (C, SDL_LoadWAV_RW, "SDL_LoadWAV_RW");
Run Code Online (Sandbox Code Playgroud)

如您所见,绑定将Uint8 **映射到System.Address。我尝试了一些技巧来将数据获取到想要的位置,但是似乎没有任何效果。现在,我的代码看起来像这样(其中包含一些自定义类型和异常):

type …
Run Code Online (Sandbox Code Playgroud)

c ada ffi pass-by-reference memory-address

2
推荐指数
1
解决办法
107
查看次数