discover char*参数大小

discover char* parameter size

本文关键字:参数 char discover      更新时间:2023-10-16

我有一个函数,它有一个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
}

我还没有编译这个代码,所以它可能需要一些更正。