【问题标题】:Global Pointer in C?C中的全局指针?
【发布时间】:2014-02-25 05:19:03
【问题描述】:

我知道指针通常是在声明时分配的,但我想知道是否有任何方法可以在 C 中创建全局指针。例如下面的代码:这是一个好习惯吗?

static int *number_args = NULL;

void pro_init(int number)
{
    number_args = &number;   /* initialize the pointer value -- is this okay? */

}

【问题讨论】:

  • 即使不赋值,也会默认赋值为零
  • 不是一个好习惯。数字基本上在堆栈上。如果将全局指针分配给堆栈地址,则函数退出时它将变得无效..!!
  • 你问了两个完全不同的问题。有什么办法吗?是的,当然......像你一样在文件范围内声明指针。 (对于 global,省略 static。)这是一种好的做法吗?应尽可能避免使用全局变量。但除此之外,正如 Manty 所说,您的 specific 用法是虚假的。 你想做什么?因为你没有展示或说明你打算如何使用number_args,所以无法判断。

标签: c pointers global


【解决方案1】:
  1. 避免使用全局变量 - 它们是个坏主意,通常会导致问题。
  2. 您正在获取堆栈上变量的地址。这将在某个地方重复使用,因此会产生意想不到的结果。

如果你觉得需要(为什么?)有一个全局指针,然后在堆外进行初始化。

【讨论】:

  • 因为完全避免全局变量而被否决。全局变量有其用途,就像其他任何事物一样。
  • @immibis “完全”这个词没有出现。赞成反对差票。
  • 好格言 - 避免使用全局变量,除非您确切知道为什么需要它们
【解决方案2】:

这是有效的。拥有全局变量有很多很好的理由,尤其是静态全局变量。但如果某些东西不需要是全球性的,最好不要让它成为全球性的。

另外请记住,如果多个线程访问该变量,您需要以某种方式保护它,可能使用互斥锁,或者您可能有竞争条件。

另外,请记住“数字”是一个堆栈变量。函数和局部变量的参数都在堆栈上分配,并且不再存在于它们的范围之外。因此,除非“pro_init()”永远不会返回,或者在返回之前将变量设置回 NULL,否则您最终会得到一个无效的指针。

您可以改用堆内存,例如:

number_args = malloc(sizeof(int));
if (number_args == NULL) { /* handle malloc error */ }
*number_args = number;

【讨论】:

  • 让代码更简单。然而,有些人更喜欢将代码的大小加倍,但不会使全局变量成为“罪恶”。
  • @someuser - 只是传递一个额外的参数,它如何使代码的大小翻倍?
  • 你可以使用很多变量。其中一些可能从程序的上层延伸。结果可能会使您的代码比它可能的更复杂。我并不是说“全局变量很好”,这在某些情况下只是一个合理的选择。与 goto 类比。
  • 使用特定全局变量的充分理由是:1) 当提高性能时,2) 当它使代码更简单时,3) 这样做遵循已经建立的项目中的现有编码约定,4)当需要正确使用某些外部库或 API 时。
  • @EdHeal 在处理别人的项目时遵循现有的编码约定是好的和正确的。拥有一个全局变量比为许多函数提供一个额外的参数要简单,特别是如果这些函数不使用该变量,而只是将其传递。当然,它也可能使代码更难推理。这取决于具体情况。但是,如果您试图说全局变量总是错误的,那么您就错了。只有西斯说话绝对。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-06
  • 1970-01-01
相关资源
最近更新 更多