全局变量指针 vs 局部变量指针

Global variable pointer vs local variable pointer

所以我明白全局变量是邪恶的,程序员应该避免使用它们。但是,我一直在研究它背后的潜在漏洞,所以这就是我现在使用它的原因。

我有这个玩具示例:

#define MAX_LENGTH 8

int counter = MAX_LENGTH;
int *size;

int main(int argc, char **argv)
{
    int value = atoi(argv[1]);
    size = &value;

    int *test;
    *test = value;

    printf("Hello World %d %d\n", *size, *test);
}

所以核心问题是为什么对于全局变量指针,我必须获取变量的地址才能存储该变量中存储的值?

我对将值存储到指针的理解是我如何使用 int *test; 变量。我只是取消引用这个变量 *test = value 来存储值。但是,我很好奇为什么对于全局变量指针*size,我不能简单地做*size = value,而是必须做size = &value

我尝试通过 Whosebug 搜索这个问题,但也许我没有正确地表述这个问题,所以我找不到相关的 link。

如果有任何提示,我将不胜感激,提前致谢,

亲切的问候,

编辑:谢谢大家的回复!

将指针视为内存中用于存储地址的位置,以便 int *test 指向 int 的指针存储包含 int 的地址。当你第一次声明它时,int *test,测试有垃圾作为它的值,因为你没有初始化它。你很幸运,垃圾恰好是“某个地址”的值。当您将该“垃圾地址”的值设置为值 *test = value; 时,您将值(int)存储在“垃圾地址”中。如果测试中的随机值恰好是无效地址,例如 0,您的程序就会崩溃。

在将值存储到该地址之前,您应该始终使用有效地址初始化指针,在本例中为 int 地址。你可以用三种地址初始化你的指针:nullptr,一个已经存在的整数的地址,或者通过new动态获得的地址,例如:

int *p = nullptr;  // valid value for a pointer, but 
                   // don't use it since it isn't pointing to a valid address yet

int value = 0;  // an integer stored in an address in the stack
int *q = &value;  // initialized with the address of value; it is said to point to value

p = &value;  // p now also points to value

int *r = new int(0);  // initialized with a dynamic address from the heap returned by new
                      // new also initialized the integer in the address with the value of 0
...
delete r;  // don't forget to destroy and free the dynamic memory when you're done using it
           // or you'll have a memory leak...

编辑:正如@Ben Voight 评论的那样。全局指针和局部指针在初始化方面存在差异。没有显式初始化的全局指针被隐式零初始化,即 nullptr。另一方面,未显式初始化的局部指针则不是,它们包含不确定的值。

    int *test;
    *test = value;

这是未定义的行为。指针未 初始化 并且未引用 有效 int 对象。您的代码“有效”只是出于偶然——您没有覆盖任何重要的内容,或者 wild(初始化指针以这种方式调用)没有引用受保护的内存区域。切勿使用任何未初始化的指针或自动变量。

这是一个非常严重的C程序错误。指针是在文件(全局)还是局部范围内定义的并不重要。它们的行为完全相同。