This question already has answers here:
How to find the 'sizeof' (a pointer pointing to an array)?
                                
                                    (13个回答)
                                
                        
                                3年前关闭。
            
                    
我如何甚至有可能获得作为指针传递给函数的字符数组的实际最大大小?

int size=0;
while (char_array[size++])


这将不起作用,因为它将返回数组中的字符数,而我需要它的实际大小。

另外,我不能使用任何库(特别是字符串)或我自己的类,也不能使用任何有用的东西。

事实证明,我将不得不快速解释一下作业。我被告知不要在评论中这样做。所以这里是:

我必须实现一个具有三个作为指针传递的字符数组的函数。无法以任何方式更改它。第一个是一个字符串,该字符串中包含命令(重要)。这些命令很简单:删除x个字母,依此类推,但是有些技巧比较棘手,例如在右边第二个/第三个字符数组中添加x个字母。为什么棘手?因为这些数组可能包含更多命令,然后将这些命令添加到我正在处理的字符串中。
因此,一种方法是对传递给函数的字符串进行处理,但这将非常慢,而且我必须在中间添加/删除字符,这基本上意味着将其余字母多次移动。因此,我将必须具有m * n个操作,其中n是字符串的大小,m是命令的数量。但是,如果我可以写入另一个字符串,则仅执行n次操作。
但是我不知道我需要多少空间,因为这些命令可以添加更多命令,这将为初始字符数量添加更多字母。事先检查命令的数量和类型会很慢,并使整个过程变得毫无意义。但是我知道传递给函数的字符串将有足够的空间(在分配规范中)。因此,如果我可以访问它的大小,则可以声明另一个具有相同大小的字符串,知道它肯定适合于resulf。

那我该怎么办?我将使用初始大小声明要写入的此本地字符串,然后如果结果更大,则将其重写为更大的字符串。这将给我n倍的z运算,其中z是多次重写,仍然比n倍好于m,但比n差。

最佳答案

如果可以更改函数签名,则可以使用一些模板魔术:

template<int N>
int foo(char (&arr)[N])
{
    int size = N;
}


假设您实际上传递了一个数组,而不是普通的指针。

如果要传递指针,则还需要传递大小,或使用非标准的技巧(例如,在实际存储大小通常存储在其之前的数组之前检查内存)

10-01 07:02
查看更多