标签: memory-address

C/C++指针是保持绝对内存地址,还是相对于应用程序,还是相对于模块?

例如,如果我在主应用程序中声明一个函数,并通过一个动态加载的库(通过dlopen在Linux LoadLibrary下或在Windows下)使用gotten符号参数(通过dlsymGetProcAddress分别)传递指向它的指针,并尝试调用该函数它会正常工作吗?

如果将指针从一个动态加载的库传递到另 我认为如果指针至少相对于应用程序而不是相对于模块/库,它应该工作.

另一个例子.我在一个应用程序中声明一个函数并将指针传递给另一个完全独立的应用程序(包括C和C++)(参数字符串或文件i/o - idk如何,只是一个想法)并尝试调用此函数,是否会工作呢?如果指针是绝对的,我可以期待它工作.也许它只是不起作用,因为系统不会因为安全而不喜欢这种交叉呼叫?

c++ pointers memory-address

10
推荐指数
3
解决办法
3479
查看次数

了解虚拟地址和虚拟地址空间

我读到,"当程序执行如下指令时MOV REG,1000,它会将内存地址1000的内容复制到REG.可以使用索引,基址寄存器,段寄存器和其他方式生成地址.

这些程序生成的地址称为虚拟地址,形成虚拟地址空间."

任何人都可以请解释一下,它是什么(这些程序生成的地址称为虚拟地址)是什么意思?

architecture virtual operating-system virtual-address-space memory-address

10
推荐指数
1
解决办法
9316
查看次数

如何获取dll-function的id(内存地址)?

我想在C#"NvAPI_DRS_EnumProfiles"中使用来自nvapi的函数.我必须使用函数的id调用QueryInterface(id).一切都工作正常,我发现我需要在网络上的其他功能的ID,但我找不到这个单一功能的ID,我不知道如何得到它.我尝试了很多东西,甚至一个打印我内存地址的c程序也行不通.

我的代码看起来像这样:http://www.drivenbynostalgia.com/files/SOP.cs

谢谢您的帮助 :)

c# dll queryinterface memory-address nvapi

10
推荐指数
3
解决办法
4412
查看次数

缺少文件名的地址[GDB]

我有以下示例代码

    #include<stdio.h>
    int main()
    {
      int num1, num2;
      printf("Enter two numbers\n");
      scanf("%d",&num1);
      scanf("%d",&num2);
      int i;
      for(i = 0; i < num2; i++)
        num1 = num1 + num1;
      printf("Result is %d \n",num1);
          return 0;
    }
Run Code Online (Sandbox Code Playgroud)

我使用-g选项将此代码编译为gcc.

gcc -g file.c
Run Code Online (Sandbox Code Playgroud)

生成单独的符号文件

objcopy --only-keep-debug a.out a.out.sym
Run Code Online (Sandbox Code Playgroud)

从a.out中删除符号

strip -s a.out
Run Code Online (Sandbox Code Playgroud)

在gdb中加载此a.out

gdb a.out
Run Code Online (Sandbox Code Playgroud)

gdb说"找不到调试信息"很好.然后我在gdb中使用add-symbol-file命令

(gdb) add-symbol-file a.out.debug [Enter]
The address where a.out.debug has been loaded is missing
Run Code Online (Sandbox Code Playgroud)
  • 我想知道如何找到这个地址
  • 是否有任何命令或技巧可以找到它?
  • 这个地址代表什么?

我知道gdb有一个其他的命令符号文件,但它会覆盖以前加载的符号.所以我必须使用此命令在gdb中添加许多符号文件.我的系统是64位运行ubuntu LTS 12.04 …

linux gdb memory-address

10
推荐指数
1
解决办法
6718
查看次数

为什么指向同一个对象的指针有不同的值?

我有这段代码:

#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 d;
    A *b1 = &d;
    B *b2 = &d;

    std::cout << (long)b1 << std::endl <<(long)b2<< std::endl;
}
Run Code Online (Sandbox Code Playgroud)

编译并运行时,它会产生以下输出:

140734705182320
140734705182328
Run Code Online (Sandbox Code Playgroud)

不完全清楚为什么指向同一地址(&d)的不同指针具有不同的值.

提前致谢.

c++ pointers memory-address

10
推荐指数
1
解决办法
600
查看次数

取一个临时的地址是否安全?

在我的计划中,我想取一个临时的地址.这是一个例子:

#include <iostream>

struct Number {
    int value;
    Number(int n) {
        value = n;
    }
};

void print(Number *number) {
    std::cout << number->value << std::endl;
}

int main() {
    Number example(123);
    print(&example);
    print(&Number(456)); // Is this safe and reliable?
}
Run Code Online (Sandbox Code Playgroud)

这将输出:

123
456
Run Code Online (Sandbox Code Playgroud)

要编译,请重新-fpermissive标记该标志.

这里是我的问题:这是安全可靠?在什么情况下会出现问题?

c++ pointers memory-address

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

gdb地址和"真实"地址之间的区别?

如果我在gdb运行C/C++程序(带-g标志编译后),我审查某些变量,参数...等的地址,然后我运行它GDB之外(使用./)将这些地址是和我在gdb中看到的相同?如果它们不同,它们通常是相似的,还是会有很大差异?

我问这个是因为我有一个缓冲区溢出程序在gdb中有效(有和没有断点),但是当我尝试在gdb之外运行它时它不起作用.

c c++ hex gdb memory-address

9
推荐指数
1
解决办法
3364
查看次数

对象的地址在其生命周期中是否已修复?

对象的地址在其生命周期中是不变的还是可以改变?我只是觉得一个对象的地址永远不会改变.它是JVM依赖的吗?我没有找到任何明确的规格.

java memory jvm object memory-address

9
推荐指数
1
解决办法
202
查看次数

方法返回值的地址

我有一个返回值的get方法:

int Foo::getValue() const
{
    return value_;
}
Run Code Online (Sandbox Code Playgroud)

我正在使用以下代码将此值写入二进制文件:

void Bar::write(const Foo& foo)
{
    /* some code... */

    file_.write(reinterpret_cast<char*>(&foo.getValue()), sizeof(int));
}
Run Code Online (Sandbox Code Playgroud)

似乎一切都运作良好.但我不确定那&foo.getValue()的事情.它总是返回getValue()返回值的地址还是有任何陷阱?

EDIT1:我不想为此创建临时var.

编辑2 :是的,它编译并正常工作.

EDIT3: write是一个ostream :: write

EDIT4:使用/ Wall和/ Za它将无法编译:错误C2102:'&'需要l值

c++ function memory-address

9
推荐指数
1
解决办法
895
查看次数

指针在C中的价值

我已经开始学习C(所以,你知道..指针).

我有这个代码:

#include <stdio.h>
#include <string.h>

int main (int argc, char* argv[])
{
    char c = 'c';
    char* cptr = &c;

    printf("c = %c\n", c);
    printf("*cptr = %c\n", *cptr);  
    printf("c address = %p\n", &c);  
}
Run Code Online (Sandbox Code Playgroud)

我的输出是:

c = c
*cptr = c
c address = 0x7fff0217096f
Run Code Online (Sandbox Code Playgroud)

当我将上面的十六进制转换为十进制时,我得到:140720994002157

我的问题:

1)这个十进制值是否代表内存地址?不是太大了吗?

2)如何将指针的值(表示c变量的地址)打印为小数?

c pointers memory-address

9
推荐指数
1
解决办法
4363
查看次数