【发布时间】:2019-08-20 00:29:54
【问题描述】:
我注意到一些关于指针和变量的问题,但我想了解详细信息。简单地说,绕过使用全局变量,我已经开始让函数返回指向函数内部数据的指针。有时,这些数据需要是静态的,有时则不需要。
例如,假设我有一个函数,它创建一个 2d 字符数组,用 'a' 填充它并返回一个指向该数组的指针。当调用者尝试使用该指针访问和修改二维数组所在的内存时,随机数据在那里而不是二维数组的内容。我发现将二维数组声明为静态可以解决此问题,因为数组的内容保存在其范围之外。
另一方面,假设我有一个声明结构的函数,并用值对其进行初始化。然后该函数返回一个指向该结构变量的指针。当试图通过指针访问结构的值时,调用者应该有无意义的数据,但有趣的是,它没有。我认为就像二维数组的情况一样,在函数调用之后,由于结构不是静态的,因此应该释放该内存中的数据。然而,它不是那样的,相反,我可以通过指针访问所有结构的元素,尽管它不是静态的。
总的来说,函数完成后,调用者可以访问和修改在该函数中创建的变量的数据,只要该数据是静态的(在二维数组的情况下),但有时变量的数据会保留在范围之外尽管没有被标记为静态(结构案例)。为什么?
【问题讨论】:
-
正式地,只要函数返回,局部变量就不再存在。在实践中,有时数据会持续更长的时间。另一方面,
static变量会在程序的生命周期内持续存在。 -
当包含它们的函数返回时,所有局部变量都会超出范围,因此指向所有类型的局部数据的指针都变得无效。如果您返回的指针似乎适用于某些类型但不适用于其他类型,这是因为运气,而不是任何定义。
-
编程不是一门实验科学。 “试试看”是一种流行的做法,并且(并非总是建议)一种流行的教学技术,但很容易从中得出非常不准确的结果。
-
我不一定要尝试。我只是在忘记将结构设为静态时遇到了它,这让我想知道为什么尽管它不是静态的,我仍然能够访问它。我认为解释是关于结构具有某种关于它们如何存储的属性。
-
@user3386109:如果你在函数内部定义了一个带有
static的对象,它的作用域是本地的(块作用域),但是当函数返回时它不会停止存在。因此,“正式地,只要函数返回,局部变量就不再存在”的说法是不正确的。 C 标准不使用“变量”或“局部变量”来定义这些概念,因此您应该避免使用它们,因为它们错误地传达了规则。
标签: c arrays pointers struct static