对动态创建的数组使用 static 关键字有啥意义吗?

Posted

技术标签:

【中文标题】对动态创建的数组使用 static 关键字有啥意义吗?【英文标题】:Is there any significance of having a static keyword for a dynamically created array?对动态创建的数组使用 static 关键字有什么意义吗? 【发布时间】:2017-08-18 22:16:15 【问题描述】:

我可以执行此代码而不会出错。所以我相信 C++ 允许这样做。 例如:

char *foo (char *start, int n) 
    static char* temp; //Does this have any significance?
    temp = new char[n];
    for (int j=0; j<n; j++)
        temp[(n-1)-j]=start[j];
    return temp;


int main()
    char *c;
    char a[6]='1','2','3','4','5','\0';
    c = a;
    int n = sizeof(a);
    c = foo(c,n);
    delete []c; //Does this delete the static array created in foo()?
    return 0;

P.S.- 我知道有一种更好的反转数组的方法,但 Q 并不专注于此。我只是想不出更好的例子。:)

编辑:我知道 temp 是在堆中创建的,我不需要使用 static。但是变量声明中的静态关键字在内存映射等中创建动态数组时有什么不同吗?

【问题讨论】:

是的,delete []c; 删除了在foo 中分配的数组。您的代码几乎没有意义,但这部分是正确的。 为什么这个变量是静态的? 原代码和现在的代码没有本质区别。这仍然没有什么意义,但delete []c; 部分仍然是正确的。 new 创建的数组不是本地的。 “动态创建的静态”是一个自相矛盾的术语。 【参考方案1】:

temp 变量是静态的,它存储地址的内存块是动态分配 (new char[n]) 和释放 (delete []c)。

它们是不同的对象。

数组不关心temp(它甚至不知道)。您可以将数组的地址存储在许多变量中;这不会以任何方式改变其行为。

我知道temp 是在堆中创建的。

temp 未在堆中创建。它是一个局部变量;局部变量不存储在堆中。

   static char* temp; //Does this have any significance?

static 关键字使temp 成为一个永久变量,从程序开始到结束都存在。 static 关键字确保其值在函数结束时不会丢失。每次执行函数foo()(第一个除外),temp的值与上次运行时相同。

但是,作为局部变量,temp 仅在 foo() 函数中可用。

temp 的值是一个内存地址。使用new char[n] 分配的块的地址。这块内存在堆中分配,并且在释放之前一直有效(使用delete []c)。它也可以从main() 访问,因为它的地址在main() 函数中以某种方式可用。它是可用的,因为对foo() 函数的调用会返回它,而main() 会将它存储在c 中。

    delete []c; //Does this delete the static array created in foo()?

不,它只删除(实际上是释放)数组(在foo() 中创建)。静态变量 (temp) 不会受到任何影响。

【讨论】:

谢谢!这很有帮助。我现在了解这段代码中到底发生了什么。【参考方案2】:

你用new[]分配了一些内存,你用delete[]释放了它。那是你应该做的。只要将与从new[] 获得的值相同的值传递给delete[],您就可以随意操作指向该内存的指针。

您的函数应该(并且正在)返回它从new[] 获得的值。如果需要,它可以将其临时存储。错误是返回一个指针或对临时对象的引用。返回临时值是可以的——否则几乎不可能返回除常量、指针或对通过引用或全局传递的参数的引用之外的任何内容。

【讨论】:

以上是关于对动态创建的数组使用 static 关键字有啥意义吗?的主要内容,如果未能解决你的问题,请参考以下文章

C中__IO和静态关键字有啥用?

java中啥时候该用static修饰方法?有啥好处或者坏处?

静态存储变量STATIC有啥用举个例吧,好像和全局变量还有些联系啊

Java中static关键字的定义

static变量有啥作用

java中static关键字的意义