代码之家  ›  专栏  ›  技术社区  ›  Dark Star1

什么类型的内存语义控制C中的数组分配?

  •  4
  • Dark Star1  · 技术社区  · 15 年前

    鉴于以下情况: 字节[]数据; 以及声明为 private byte[]构造_command()

    如果我要那么分配结果 构造命令() Sdata sdata是指向从函数返回的内容,还是为内存中的sdata分配一些空间,并将函数结果的内容复制到其中?

    7 回复  |  直到 10 年前
        1
  •  2
  •   Rui Craveiro    15 年前

    假设sdata是一个局部变量,它将位于堆栈中,并且将 参考 方法返回的数组。方法不返回数组本身的内容,而是返回对数组的引用。

    在.NET中,数组是第一类对象,所有数组类型变量实际上都是引用。

        2
  •  6
  •   JaredPar    15 年前

    该分配将简单地分配sdata以引用construct_命令返回的实例。不会复制数据。

    一般来说,clr将世界分为两种类型

    • 值类型:这是从System.ValueType派生的任何内容。这些类型的值之间的赋值是按值进行的,基本上会在位置之间生成值的副本。
    • 引用类型:任何其他类型。这些类型的值之间的赋值只会导致位置引用内存中的不同对象。不复制值

    数组是CLR中的引用类型,因此不会导致基础值的复制。

        3
  •  3
  •   Henk Holterman    15 年前

    数组是引用类型,这意味着实际数组是在堆上实例化的(可能是由construct_command()实现的),函数返回对数组的引用,并将其存储在(本地变量)sdata中。

    因此,这实际上不是关于内存语义(返回值可以为空),而是关于引用类型的复制语义。这种情况完全等于,例如:

    StreamReader reader = System.IO.File.OpenText(filename);
    

    更直截了当一点:在.NET中根本不能传递数组,只能传递、复制和分配对数组的引用。

        4
  •  2
  •   JSBÕ±Õ¸Õ£Õ¹    15 年前

    sdata将指向从函数返回的内容。C中的数组是引用类型,这意味着从另一个数组分配一个数组只是复制引用,而不是分配新数据。

        5
  •  2
  •   Dewfy    15 年前

    数组是引用类型,因此只复制引用。没有内容操作。

        6
  •  0
  •   sepp2k    15 年前

    sData 将指向返回的数组 construct_command .

        7
  •  0
  •   Appurist - Paul W    10 年前

    尽管芮成华的回答总体上很好,但我确实认为其中的一部分是错误的。从堆栈内存分配数组,然后通过引用访问,这是没有意义的(非常不一致)。如果这是真的,那么底层内存可以从传递引用的任何方法的底层释放。

    我相信当亨克·霍尔特曼非常直接和明确地说:

    数组是引用类型,这意味着实际数组是 在堆上实例化

    谢谢你亨克的评论,我认为这是一个关键部分,否则会错过(并与)接受的答案相矛盾。

    (我本来会回复一条评论,但我没有足够的回复点,我认为重要的是要指出接受的答案有这个问题,我需要在这里添加一条新的评论。)也许管理员可以从答案中删除对“局部变量,它将在堆栈中”的引用。