发现char *参数大小

时间:2012-08-28 18:50:02

标签: c++ function parameters char

我有一个函数,其char*作为参数从函数内部接收一些信息。 (int foo(char* param1)

我怎样才能确定此参数是否有足够的分配空间来接收我需要输入的所有信息? 我可以确定它是否是一个有效的指针,但我还没有找到一种方法来确定分配给参数的大小/长度。

我无法更改功能(无法添加大小的其他参数)。

4 个答案:

答案 0 :(得分:6)

AFIAK,C ++没有任何工具来验证分配给指针的空间量。如果输入指向以NULL结尾的chracters数组(即c-string),则可以使用strlen()。通常,C和C ++中的这些类型的函数必须充分记录,以确定参数的预期值。该函数通常在假定调用者遵守记录的合同时实现。

答案 1 :(得分:5)

如果我已正确理解了问题,则无法确定与指针关联的有效内存的大小。如果这是指向一个数组数组,通常传递一个大小参数的方法,但如果你没有这个选项,你就不知道你将访问什么

答案 2 :(得分:4)

简单回答:你做不到。

更复杂的C风格答案:如果该字符数组具有终止NUL(0)字节,则可以使用strlen()

特定于操作系统的答案:如果使用malloc()获取阵列的内存,则至少可以分别在OS X和Linux上使用malloc_size()malloc_usable_size()。在Windows上,对于使用Microsoft C运行时的应用程序,有_msize()函数。

答案 3 :(得分:1)

你不能确定。并不是的。您可以对指针有效性进行的唯一实际检查是检查它是否不是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
}

我没有编译此代码,因此可能需要进行一些更正。