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

时间:2015-06-01 08:14:50

标签: c++ c function memory

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

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

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

考虑这个例子:

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

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

4 个答案:

答案 0 :(得分:4)

您可能存在隐藏错误。不要手动做那个废话,总是使用像std::string这样的东西。

答案 1 :(得分:1)

function参数是指向char值的指针。函数调用生成指针的副本,即地址的副本到char值。

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

对于所有函数都知道,指针可以为null,它可以指向一个char,或者它可以指向已经在内存中分配的chars数组。

根据您在该功能中尝试做的事情,您可以例如 1)在附加参数中告诉函数有关已分配内存的大小。 2)使用不同的数据类型。例如,如果意图是指向一个字符串的参数,那么请考虑将引用传递给字符串类型的对象。

答案 2 :(得分:1)

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

  

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

事实上。在这种情况下,会生成指向字符串的指针的副本。

  

问题是:函数是否知道其参数在内存中占用多少空间?

当然,只需取sizeof(X)即可得到指针的大小(32位系统上的4个字节)。至于“函数是否知道”指针所指向的数据的性质......它取决于程序员。

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

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

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

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

答案 3 :(得分:1)

  

问题是:函数是否知道其参数在内存中占用多少空间?

是的。在您的情况下,您传递指向该函数的指针。任何类型的指针都具有相同的大小,在32位机器上它的32位(4字节)。

  

如果答案是肯定的,我们如何在功能范围内检索它?

您可以致电sizeof()运营商。但是在你的情况下,我假设你想获得指针所指向的数组元素的数量。你无法做到这一点。

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

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

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

您准备使用代码存档的内容是什么?

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