【问题标题】:can realloc Array, then Why use pointers?可以realloc Array,那为什么要用指针呢?
【发布时间】:2010-09-17 03:31:42
【问题描述】:

这是我面临的一次求职面试。他们问我们是否可以重新分配数组,我说可以。然后他们问 - 为什么我们需要指针,因为大多数人给出了它浪费内存空间的理由。我无法给出满意的答复。如果有人能给出满意的答复,我将不胜感激。如有与上述说法相矛盾的情况,请提及。

谢谢。

【问题讨论】:

    标签: c++ c pointers data-structures


    【解决方案1】:

    您只能重新分配动态分配的数组。如果是静态分配的,则无法[安全]重新分配。*

    指针在内存中保存数据的地址。它们可以使用 C++ 中的 new/delete 运算符和 C 中的 malloc/free 动态分配、解除分配和重新分配。

    我强烈建议您阅读 Kernighan 和 Ritchie 的 The C Programming Language 以及 Herbert Schildt 的 C++ From the Ground Up 等可靠的 C++ 文本。

    使用动态内存、指针、偏移量等都是使用这两种语言的基础。不知道它们是如何工作的以及它们存在的原因可能是潜在雇主拒绝你的一个原因。

    *编译器不应该让你重新分配静态分配的任何东西,但如果这样做,行为是未定义的

    【讨论】:

    • Schildt 的 C++ 是否比他的“带注释的 C 标准”更好?
    • 我还没有看过他的带注释的 C 标准 - 所以我不能直接评论,但我在课堂上使用了 Ground Up 这本书,发现学生们真的“明白”了文字
    【解决方案2】:

    措辞有点奇怪,但对我来说,面试问题似乎是一个开放式问题,旨在让你解释你对数组、指针、动态内存分配等的了解。如果我是面试官,我'希望应聘者阐明int *a = malloc(10 * sizeof(int)); 和int a[10]; 之间的区别。后续问题的措辞不是很好,但可能是试图在指针和数组之间的差异方向上推动候选人并引发思路。

    【讨论】:

      【解决方案3】:

      好的。您不能重新分配已静态声明的数组。使用指针(而不是静态声明的数组)的目的是让您可以重新分配空间。我想,从技术上讲是正确的,您可以通过将指针传递给静态定义的数组来重新分配它,但我不想这样做。如果指针指向不是由 malloc 分配的内存,则行为未定义。

      【讨论】:

      • realloc 函数让我们增加或减少先前分配的区域的大小。(最常见的用法是增加一个区域。)例如,如果我们为数组中的 512 个元素分配空间,我们在运行时填写但发现我们需要超过 512 个元素的空间,我们可以调用 realloc。
      • linux.die.net/man/3/realloc - 对于静态分配的项目仍然无济于事
      【解决方案4】:

      我真的不明白使用指针是如何“浪费内存”的。 realloc 函数:-

      void *realloc(void *ptr, size_t size);
      

      将指向要调整大小的内存的指针作为参数。此外,指针的用途比动态内存多得多,例如通过引用传递。

      【讨论】:

      • “浪费内存”可能意味着 int *ra = malloc(10*sizeof(int));导致使用比 int ra[10] 更多的存储空间;由于您的 malloc 实现的开销。但是有更好的理由在适用的情况下在堆栈上使用数组。
      • 哦,当数组属于由结构表示的东西时,存储指向数组的指针会明显“浪费”内存,而不是仅仅将数组嵌入到结构中并通过成员访问名称,使用额外的 sizeof(void*) 字节。
      猜你喜欢
      • 2014-03-31
      • 2021-12-13
      • 1970-01-01
      • 2021-04-25
      • 2013-12-27
      • 2017-10-21
      • 1970-01-01
      • 2016-08-23
      • 2015-03-28
      相关资源
      最近更新 更多