c - 在函数中将数组声明为静态的目的是什么?

标签 c arrays pointers static garbage

我创建了一个函数(例如:fun())并从主函数调用它。我还在函数中创建了一个数组,我将数组的基地址返回给主函数中的整数指针.如果在函数 fun() 中将数组声明为静态,则数组元素将在主函数中正确显示。如果不是,则会打印一些垃圾值。但反之亦然,效果很好。即,decalring主函数中的一个数组,并通过传递基地址在另一个函数中打印它。那么将数组声明为静态数组有什么用呢?正确的解释是什么?

最佳答案

如果一个对象在函数中被声明为静态的,那么它本质上是一个全局的和永久的,不会像其他局部变量一样在每次调用函数时都重新初始化。

如果你有一个函数本地的非静态对象,并且你返回它的地址,当调用者用这个地址做一些事情时,这个对象已经超出了范围,因为你不再在函数的主体中被调用的函数,以及你的指针指向的内存区域中有未定义的数据,不管你之前放在那里的是什么。如果对象是静态的,那么它不会超出范围。

如果您有一个main 的本地对象,并且您从main 调用一个函数并将指针传递给该对象,那么该对象仍然存在程序而言,因为你仍然“在”主函数中,并且当你离开被调用函数的主体时会返回到它,所以引用该内存区域是没有问题的。这与 main 无关:从不同的函数尝试同样的事情。

顺便说一句,这些都与数组无关,整个讨论适用于任何类型的对象。

关于c - 在函数中将数组声明为静态的目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20843759/

相关文章:

尽管免费,但 C 内存泄漏

c - 指向整数数组的指针数组

c++ - 变量的连续地址

c - 当应为False时返回True(C;使用函数)

c - 在 C 中使用 strok 解析 NMEA 字符串

c - 为什么 Linux 内核模块中定义的 mmap 返回 MAP_FAILED?

c - 使用 ‘-Wcast-qual’ 选项检查编译

java - 在 java 属性文件中表示数组的更好方法

mysql - 如何基于输入数组在双向多对多关系中选择多个值

Javascript 数组使用索引合并