虽然它非常基本并且可能看起来很傻,但我试图了解 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
?.
最佳答案
让我们从基础开始:指针是包含指向给定类型数据的地址的变量。如果我们声明
datatype* foo;
foo
(当前未初始化)将包含类型为 datatype
的变量的地址。 ,并尊重它*foo = ...;
我们正在访问该地址并将其值存储在那里。
在这两种情况下,我们都有
* foo
,但它们不一样!datatype
.变量类型为 datatype *
;变量名是 foo
. foo
包含地址。 所以,当你写
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.
int *ptr = 0xc42;
你对编译器说你声明了一个名为 ptr
的变量, 类型 int *
并且其第一个值是 0xC42
. ( 注意: 由用户正确说明 Lundin ,此分配需要进一步强制转换才能成为有效的 C)。 *ptr = 45;
您正在访问 ptr
指向的地址并赋值 45
.合法吗?好吧,如果您之前分配了一个有效地址(一般来说,如果您使用 &
运算符将另一个变量的地址分配给一个指针,例如 int *ptr = &a;
)。但是如果你给它分配一个随机整数......它可能会导致段错误。 关于c - int *ptr= 5 怎么做;与 int *ptr= 变量地址不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60752408/