一个函数知道它的参数占用多少内存吗?

does a function know how much memory its parameters occupy?

当我们调用按值传递的函数时,我们在内存中复制了实际参数的值。

问题是:函数是否知道space它的参数在内存中占用了多少?如果答案是肯定的,我们如何在函数范围内检索它?

如果答案是否定的,我们是否有潜在的隐藏内存错误?

考虑这个例子:

#include <stdio.h>
void func(char * X)
{
    X +=98;
    *X='C'; //is this really OK? or we have hidden memory error?
    *++X='[=10=]';
     --X;
    puts(X);     }

int main()
{
    char A[100];
    char *B =A;
    func(B);
    return 0;
}

您有一个潜在的隐藏错误。不要手动做那些废话你自己总是使用像 std::string.

这样的东西

函数参数是一个指向char值的指针。函数调用复制了指针,即将地址复制到 char 值。

该函数无法知道在该地址分配了多少内存(如果有的话)。

就函数所知,指针可以为空,它可以指向单个字符,也可以指向一个字符数组,该数组已分配到内存中。

根据您要在函数中执行的操作,您可以例如 1) 在附加参数中告知函数分配内存的大小。 2) 使用不同的数据类型。例如,如果目的是让参数指向一个字符串,那么考虑将引用传递给一个字符串类型的对象。

在 C++ 中,您可能根本不应该像这样进行手动字符串操作,std::string 是首选。我假设您使用的是 C,因为无论如何 #include <stdio.h> 在 C++ 中已经过时了。

When we call function passing by value, we are making a copy in memory of the actual parameters' value.

确实如此。在这种情况下,将创建指向字符串的指针的副本。

The question is: does the function know how much space its parameters occupy in memory?

当然,只需取 sizeof(X) 即可得到指针的大小(在 32 位系统上为 4 个字节)。至于一个"function knows"那个指针指向的数据的性质是不是……这取决于程序员。

如果该函数的程序员已正确记录指针必须指向一个已分配的 100 字节数组,那么该函数可以自由地假设它被传递了这样一个指针。

如果程序员没有记录任何东西,那么没有人会知道如何使用该函数,在这种情况下,程序中的任何内容都没有任何意义。除非函数定义对调用者可用。

或者,您可以编写自记录代码:void func(char X[100])。此代码 100% 等同于您所拥有的代码:它还传递一个指针。但是仍然不能保证这个指针指向一个 100 字节的数组,我们只是向调用者添加了一个我们期望的提示。如果他们通过其他东西,程序仍然可能会停止并着火。

如果您想知道如何在不实际将其作为参数传递的情况下找出所指向数据的大小,read this

The question is: does the function know how much space its parameters occupy in memory?

是的。在你的例子中,你传递了一个指向函数的指针。任何类型的指针都具有相同的大小,并且在 32 位机器上它是 32 位(4 字节)。

If the answers is yes, how we can retrieve it in function scope?

您可以通过调用 sizeof() 运算符来实现。但是,在您的情况下,我假设您想要获取指针指向的数组元素的数量。在你的情况下你不能这样做。

void func(char * X)
{
    X +=98;
    *X='C'; //is this really OK? or we have hidden memory error?
    *++X='[=10=]';
     --X;
    puts(X);     
}

此代码容易出错。无法保证 X 指向至少包含 100 个元素的数组,但您的代码假设它确实如此。如果您编写以下代码,您确实存在内存泄漏。

int main()
{
    char A[50];
    char *B =A;
    func(B);
    return 0;
}

您究竟想用您的代码归档什么?

旁注:如果这确实是一个 C++ 问题,我还建议使用 std::string 进行字符串操作。它使很多事情变得容易得多:)