全局变量指针 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程序错误。指针是在文件(全局)还是局部范围内定义的并不重要。它们的行为完全相同。
所以我明白全局变量是邪恶的,程序员应该避免使用它们。但是,我一直在研究它背后的潜在漏洞,所以这就是我现在使用它的原因。
我有这个玩具示例:
#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程序错误。指针是在文件(全局)还是局部范围内定义的并不重要。它们的行为完全相同。