【问题标题】:How to get a byte array in c/c++ from a function with unknown return type?如何从返回类型未知的函数中获取 c/c++ 中的字节数组?
【发布时间】:2020-11-02 09:37:46
【问题描述】:

例如,我知道函数的地址(比如说它的0x0183ad0),我想从该函数中获取一个返回未知类型的对象:

unknownType(*fname)() = (unknownType(*)())0x0183ad0

是否有任何全局类型可以替换 unknownType 或任何方法将该对象作为字节数组(我知道 sizeof(unknownType)

注意:

函数返回一个对象而不是指针


编辑:

这要归功于 Botje 的回答:

【问题讨论】:

  • 数组不是指针。数组是实际存在于内存某处的一块内存。 一个数组有一个地址。指针是一个单一的整数类型变量,它HOLDS 一个地址——一个可能有效也可能无效的地址。你的家存在于某个地方,你会收到邮件,因为它有一个地址。但是,如果你在一个盒子上放一些随机地址并邮寄,你不知道它会去哪里。如果你得到正确的盒子上的地址,它会被发送到你想要去的地方。
  • 为了未来,阿敏,Do not post pictures of code.
  • 抱歉。我稍后会编辑它

标签: c++ c byte function-pointers return-type


【解决方案1】:

“字节数组”将是uint8_t*unsigned char*

如果你知道unknownType 的大小,我会创建一个

struct unknownType {
    uint8_t stuff[123];
};

这样您就可以在更好地理解其字段时调整结构定义。

【讨论】:

  • 但是数组是指针,指针会指向另一个地址而不是对象。对于您的示例,该数组将仅占用对象中的前 4 个字节(指针长度为 4 个字节),并且应用程序可能会崩溃。
  • 这取决于函数实际返回的内容。如果它返回一个指针,则需要将地址转换为返回unknownType* 的函数。如果它返回一个结构,我的答案将起作用,因为编译器逐个字段复制(或 memcpy,如果它是一个 POD)
  • 不,如果它返回一个结构,你的答案将不起作用,因为数组是一个指针!如果我们将前四个字段存储为指针地址,应用程序将崩溃!
  • 数组不是指针。在 C++ 中,这将按描述工作。
  • 我不确定你想在那里证明什么。 sizeof(t) = sizeof(Test*) = 4(在您的系统上)。 sizeof(*t)sizeof(Test) 将产生正确的 123。
【解决方案2】:

您可以定义一个 void 函数指针并将该原型用于您拥有地址的每个函数:此示例中的返回值是一个 RANDOM STRUCTURE 它可以是您想要的任何字节、整数的整个数组, chars- 对于每个调用的函数,这当然可能不同,只要函数签名相同(如果需要不同的输入,您总是可以在参数列表上添加一个 void 指针)

#include <stdio.h>

typedef struct _RANDSTRUCT 
{
    int Num ;
} RANDSTRUCT ;

typedef void * UNKNOWNFUNC (void) ;

UNKNOWNFUNC *myFunc() ;

int main()
{
    void *retP ;
    UNKNOWNFUNC *fnP ;
    
    retP = myFunc () ;

    printf ("Num %d (direct call)\n", ((RANDSTRUCT *)retP)->Num) ;

    fnP = (void *)&myFunc ;
    retP = fnP () ;
    
    printf ("Num %d (fn addr call)\n", ((RANDSTRUCT *)retP)->Num) ;
    
    return 0;
}

UNKNOWNFUNC *myFunc () {
    static RANDSTRUCT randstruct[2] = {100, 200} ;
    
    return ((void *)&randstruct[0]) ;
}

【讨论】:

  • 不。我的问题是该函数返回一个对象,而不是指向它的指针。
  • 原来的问题说C/C++,这个答案是针对C的,结构(和指针)是最接近对象的。
  • 标识符_RANDSTRUCT 保留给语言实现。通过定义它,程序将具有未定义的行为。您应该为 sruct 指定另一个名称。或者让它不命名,因为你也给它一个类型名称。
【解决方案3】:

如何在 c/c++ 中从返回类型未知的函数中获取字节数组?

在 C++ 中调用函数的唯一方法是知道它的返回类型。如果不知道返回类型,就无法调用函数,也就无法获取函数返回的对象。

感谢 Botje 的回答,它成功了

它可能看起来可以工作,但程序的行为是未定义的。

【讨论】:

  • 为什么是未定义的行为?我可以谨慎地测试它,然后诀窍就完成了。我什至可以用它访问私人成员
  • @AminGuermazi Why undefined behaviour ? 因为 C++ 语言说它是。例如,请参阅stackoverflow.com/a/54317751/2079303I can test it with caution 我怀疑您现在和将来是否能够测试该代码的每次执行。无论您测试多少次,它都不能保证有效。
猜你喜欢
  • 1970-01-01
  • 2012-01-29
  • 1970-01-01
  • 2020-02-14
  • 2015-09-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多