Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为发送到方法的参数分配的大小_C++_Windows_Parameters_Memory Management - Fatal编程技术网

C++ 为发送到方法的参数分配的大小

C++ 为发送到方法的参数分配的大小,c++,windows,parameters,memory-management,C++,Windows,Parameters,Memory Management,如果我知道函数的帧指针和返回地址,有没有办法知道发送给函数的参数所分配的空间大小? (最好不使用调试符号)您通常会看到以下函数: myFunction(char* buffer, int bufferSize, ...) { ... } 如果不将大小作为第二个参数(或在结构中)发送,则无法确定分配的空间。但如果这是一个字符串或另一个带有有效分隔符的字节数组,则可以检查大小(而不是分配的空间) 编辑:要获取参数大小,需要使用va_列表,va_开始,va_参数,va_结束库函数 一般来说,没有。首

如果我知道函数的帧指针和返回地址,有没有办法知道发送给函数的参数所分配的空间大小?

(最好不使用调试符号)

您通常会看到以下函数:

myFunction(char* buffer, int bufferSize, ...) { ... }
如果不将大小作为第二个参数(或在结构中)发送,则无法确定分配的空间。但如果这是一个字符串或另一个带有有效分隔符的字节数组,则可以检查大小(而不是分配的空间)

编辑:要获取参数大小,需要使用
va_列表
va_开始
va_参数
va_结束
库函数


一般来说,没有。首先,您不知道调用约定,因此您不知道参数是如何传递的,谁应该清理它们。即使您知道调用约定,我也不相信有一种简单易行的方法来确定您的请求。

如果所有数据都在堆栈上分配,那么对于函数foo(par1,par2,…,par10),参数par1,…,par9的大小应该是((long)&par10)-(long)&par1)


您可以在参数列表的末尾添加一个伪参数,这将允许您确定所有实际参数的大小。

什么类型的参数?它是动态分配的指针还是某个对象?我想OP是在问他是否能计算出所有参数的大小。。为什么要这样做?我需要知道该方法的堆栈帧在哪里结束,它在为传入的参数分配的空间之后结束……你需要知道函数内部的情况吗?我实际上是从外部看的。就像调试器一样。调试器必须这样做,可能它们确实存储了关于符号中参数的额外信息?@Benj调试器通常有调试信息。但他们不需要知道分配给参数的空间大小,不管这意味着什么。但我不关心它是如何传递的,也不关心它的内部顺序,我只想知道它的大小。@David Debuggers通常可以打印出任何给定堆栈帧中所有参数的值,因此,他们可能需要知道在展开每个帧时它们都有多大…@ldov-在某些调用约定(例如win32 64位)中,参数部分传递到寄存器而不是堆栈,这意味着即使调试器也无法使用这些参数。。。您需要知道调用约定,以便在计算堆栈上生成的偏移量时能够考虑到这一点。如果函数类似于:foo(char*buffer),那么就可以了,除非得到结果=4(指针的大小),我看到了。那么这应该是你的出发点@Idov:该参数可以在寄存器中传递,也可以是所有参数传递都与8字节边界对齐,或者类似的方式。指针的大小也不是所有通用体系结构上的4。