例如,如果我在主应用程序中声明一个函数,并通过一个动态加载的库(通过dlopen在Linux LoadLibrary下或在Windows下)使用gotten符号参数(通过dlsym或GetProcAddress分别)传递指向它的指针,并尝试调用该函数它会正常工作吗?
如果将指针从一个动态加载的库传递到另 我认为如果指针至少相对于应用程序而不是相对于模块/库,它应该工作.
另一个例子.我在一个应用程序中声明一个函数并将指针传递给另一个完全独立的应用程序(包括C和C++)(参数字符串或文件i/o - idk如何,只是一个想法)并尝试调用此函数,是否会工作呢?如果指针是绝对的,我可以期待它工作.也许它只是不起作用,因为系统不会因为安全而不喜欢这种交叉呼叫?
我读到,"当程序执行如下指令时MOV REG,1000,它会将内存地址1000的内容复制到REG.可以使用索引,基址寄存器,段寄存器和其他方式生成地址.
这些程序生成的地址称为虚拟地址,形成虚拟地址空间."
任何人都可以请解释一下,它是什么(这些程序生成的地址称为虚拟地址)是什么意思?
architecture virtual operating-system virtual-address-space memory-address
我想在C#"NvAPI_DRS_EnumProfiles"中使用来自nvapi的函数.我必须使用函数的id调用QueryInterface(id).一切都工作正常,我发现我需要在网络上的其他功能的ID,但我找不到这个单一功能的ID,我不知道如何得到它.我尝试了很多东西,甚至一个打印我内存地址的c程序也行不通.
我的代码看起来像这样:http://www.drivenbynostalgia.com/files/SOP.cs
谢谢您的帮助 :)
我有以下示例代码
#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 …
我有这段代码:
#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)的不同指针具有不同的值.
提前致谢.
在我的计划中,我想取一个临时的地址.这是一个例子:
#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标记该标志.
这里是我的问题:这是安全和可靠?在什么情况下会出现问题?
如果我在gdb运行C/C++程序(带-g标志编译后),我审查某些变量,参数...等的地址,然后我运行它GDB之外(使用./)将这些地址是和我在gdb中看到的相同?如果它们不同,它们通常是相似的,还是会有很大差异?
我问这个是因为我有一个缓冲区溢出程序在gdb中有效(有和没有断点),但是当我尝试在gdb之外运行它时它不起作用.
对象的地址在其生命周期中是不变的还是可以改变?我只是觉得一个对象的地址永远不会改变.它是JVM依赖的吗?我没有找到任何明确的规格.
我有一个返回值的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(所以,你知道..指针).
我有这个代码:
#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变量的地址)打印为小数?