【问题标题】:Declaring Array as a pointer in C [duplicate]在C中将数组声明为指针[重复]
【发布时间】:2019-09-17 17:46:17
【问题描述】:

我有一个类似数组的声明

int a1[5];

如果我这样声明这个数组:

int *a2;
a2 = malloc(sizeof(int)*5);

然后像我使用数组a1那样使用它有什么区别。此外,如果这是在函数中完成的并且函数结束 a1 和 a2 超出范围。在 a1 的情况下,内存会自动释放,但在 a2 的情况下,它是自动完成的,还是我们必须使用 delete 释放它?

【问题讨论】:

  • 数组不是指针。指针不是数组。您不能将一个声明为另一个。你可以有一个指向数组的指针,但这与声明它们中的任何一个都没有关系。
  • 感谢您的评论。作为 2 个比较声明的最终结果,内存映射有什么不同?如果我错了,请纠正我,但我的印象是这两种类型的声明都会导致 5 个 *sizeof(int) 存储位置的连续内存空间。因此问题是有什么区别?
  • 第二个片段唯一声明的是一个指针。导致 5*sizeof(int) 大小的连续内存空间的原因不是声明,而是动态分配,它与声明完全分开,与声明的事物的生命周期完全不同,等等。

标签: c arrays pointers


【解决方案1】:

当你写作时

int a[10];

你说

"给我分配10块内存,每块可以存储一个整数 价值”。

默认情况下,当您将此定义放在块中时(部分代码被{} 包围),您不能在块外使用变量a。

为什么?假设程序正在块内执行指令并且遇到了这个定义。它分配一些内存来存储变量a。当程序发现它已经到达块的末尾时,它会破坏它在块中分配的整个内存。因此,当您在右大括号 (}) 之后引用代码中的 a 时,它不知道 a 是什么,因为内存已被破坏。

另一方面,当你写作时

int* a = (int*) malloc(10*(sizeof(int)));

你说

"分配 10 块特殊内存给我,每块可以存储一个 整数值”

。这种特殊的内存称为堆内存。它很特别,因为它存在于一个永远不会被破坏的新地方(除非你要求它)。因此,您甚至可以在块外访问它。

【讨论】:

    【解决方案2】:

    a2 的内存不会被自动释放。您始终可以遵循这个简单的经验法则 - 如果您使用 malloc 分配它,则需要使用 free 释放它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-13
      • 1970-01-01
      • 2014-09-06
      • 1970-01-01
      相关资源
      最近更新 更多