discover char*参数大小
discover char* parameter size
我有一个函数,它有一个char*
作为参数,用于从函数内部接收一些信息。(int foo(char* param1)
)
我如何确保此参数有足够的分配空间来接收我需要输入的所有信息?我可以确定它是否是一个有效的指针,但我还没有找到一种方法来确定分配给参数的大小/长度。
我无法更改函数(无法添加其他大小的参数)。
AFIAK,C++没有任何功能来验证分配给指针的空间量。如果输入指向一个以NULL结尾的chracter数组(即c-string),则可以使用strlen()。通常,C和C++中的这些类型的函数必须充分记录参数的预期内容。该函数通常是在调用方遵守文档约定的情况下实现的。
如果我正确理解了这个问题,就无法确定与指针相关的有效内存的大小。如果它指向一个数据数组,这是传递大小参数的常用方法,但如果您没有该选项,则不知道将访问什么
简单的答案:你不能。
稍微复杂一点的C风格答案:如果这个字符数组有一个终止NUL(0)字节,那么可以使用strlen()
。
特定于操作系统的答案:如果阵列的内存是使用malloc()
获得的,则至少可以在操作系统X和Linux上分别使用malloc_size()
和malloc_usable_size()
。在windows上,对于使用Microsoft C Runtime的应用程序,有_msize()
函数。
你不能确定。不是。您可以对指针有效性进行的唯一实际检查是检查它是否不是NULL
。
就param1
所指向的缓冲区大小而言,唯一想到的就是这个愚蠢的破解。在调用函数之前,将缓冲区的大小放在param1
所指向的缓冲区的开头。然后,将数据复制到缓冲区中,在完成检查时覆盖大小。
像这样:
*(unsigned int*)param1 = buf_size;
foo(param1);
int foo(char* param1)
{
if (0 == param1)
{
// fail
}
unsigned int buf_size = *(unsigned int*)param1;
if (buf_size < whateverlimit)
{
// fail
}
// copy data into the buffer
}
我还没有编译这个代码,所以它可能需要一些更正。
- 使用c#访问c++dll中带有char*参数的函数时发生AccessViolationException
- 将函数参数"const char*"转换为"std::string_view"是
- 如何在不强制转换每个参数的情况下删除初始值设定项列表中从 int 到 char 的缩小转换?
- JavaCPP 错误:无法将参数"1"的"char*"转换为"Abc*
- 构造函数 (C++) 中的 char 指针参数存在问题
- C++错误:无法将参数 2 从 'char' 隐蔽到 char[]'
- 在标准中,模板参数的语法在哪里定义,例如,'std::function<int(char)>'?
- 知道模板参数在编译时是否为 const char*?
- C++ [错误] 声明'char '隐藏参数。什么意思?
- 为什么const char*和const char[]作为函数参数被认为是等价的
- 如何将char数组声明为函数参数?或告诉我此代码中还有其他问题?
- C++ 类型 "char" 的参数与类型 "const char" 的参数不兼容
- 当我将 char 数组发送到输入参数为字符串的函数时会发生什么?
- 类型 "const char *" 的参数与类型 "char *" 的参数不兼容
- 从 C# GUI 将 char * 参数传递给C++ dll 函数
- 标准对 char 数组作为模板参数有什么看法?
- 为什么将char*传递给字符串参数会产生汇编错误
- llvm 调用一个以 char * 作为参数的外部函数
- 我在 VC32 中有 Win6 DLL,并使用参数 char* 调用 C#
- <char>仅提供模板参数"char"的basic_string如何工作,而basic_string是一个有参数的模板