C中的全局指针?

时间:2014-02-25 05:19:03

标签: c pointers global

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

static int *number_args = NULL;

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

}

2 个答案:

答案 0 :(得分:7)

  1. 避免使用全局变量 - 这是一个坏主意,通常会导致问题。
  2. 您正在堆栈上获取变量的地址。这将在某个地方重复使用,从而产生意想不到的结果。
  3. 如果你觉得有必要(为什么?)有一个全局指针,那么如果离开堆就会初始化。

答案 1 :(得分:1)

这是有效的。拥有全局变量有很多充分的理由,尤其是静态全局变量。但是,如果某些事情不需要是全球性的,那么最好不要将其全球化。

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

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

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

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