【发布时间】:2020-03-19 07:11:16
【问题描述】:
虽然它非常基本并且可能看起来很傻,但我试图了解 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;
}
案例 2:
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 = ....,您声明了一个指向整数的指针,并使用非真实地址对其进行初始化。等于 0xc42 的是 ptr,而不是 *ptr!稍后您访问该地址,这是非法的,因为该地址是非法的。 -
@RobertoCaboni 感谢您的回复。那么,是否 int *ptr = &a 在案例 2 中创建对象,并且稍后可以更改为不同的整数值,如案例 2?但是如果缺少 case-1?我的理解是对的吗!!?案例1分配如何导致非法是我试图理解的,如果我错了,请纠正我。