虽然很基础,可能看起来有些愚蠢,但我想了解以下两种情况的区别:int *ptr = 45
或 0xc8750;
(一些数字)和int *ptr= &a;
(变量的地址)。
我已经知道的是:
- 指针用于存储变量的地址并修改所指变量的内容(但我想知道如何实现)
- 在后一种情况下,我可以将
*ptr
分配给不同的合法地址。 - 但是,在第一种情况下,这是不合法的!
为什么后者如果地址/数字都是整数就是不合法的?在内存中存储时会有哪些不同处理方式?
我有两个几乎相同的代码/程序,用于突出显示此问题:
情况1:
#include <stdio.h>
int main()
{
int *ptr = 0xc42; // is this stored in read only memory?!! which later leads to seg faults in further assignments?!
*ptr = 45; //illegal leads seg fault.
return 0;
}
案例二:
int main()
{
int a=10, b=20;
int *ptr = &a; // is here get any special treatment and object will be created for *ptr!!!
*ptr = &b; //legal
printf(" *ptr = %d \n", *ptr);
*ptr = 20; //legal !!
printf(" *ptr = %d \n", *ptr);
*ptr = 50; //legal
printf(" *ptr = %d \n", *ptr);
return 0;
}
我们可以看到
*ptr = 20
和*ptr = 50
是合法的,没有出现分段错误。为什么int *ptr = 0xc989
或5的赋值与int *ptr = &variable
不同呢?请注意区分它们的类型和地址。
int *ptr = ....
语句,你声明了一个指向整数的指针,并用一个不是真实地址的值进行初始化。这个值会赋给 ptr,而不是 *ptr!之后你访问了这个地址,但这是非法的,因为这个地址本身就是非法的。 - Roberto Caboni