【问题标题】:Reason of error on pointer de-referencing指针取消引用错误的原因
【发布时间】:2016-04-25 15:14:06
【问题描述】:
输出是:10,它没有给出错误。
int main(){
int j=10;
int *i=&j;
printf("%d",*i);
return 0;
}
但它给了我一个错误:
int main(){
int *i;
int j=10;
*i=&j;
printf("%d",*i);
return 0;
}
我了解指针取消引用导致错误。但这是怎么回事?
【问题讨论】:
标签:
c
pointers
dereference
【解决方案1】:
因为您使用的是未初始化的指针。
你的*i = &j 应该是i = &j
【解决方案2】:
这将i定义为int *并将其值设置为j的地址:
int *i=&j;
这将i 定义为int *,然后尝试将i 指向的对象设置为j 的地址:
int *i;
int j=10;
*i=&j;
最终的*i = ... 正在尝试取消引用一个未初始化的变量。
【解决方案3】:
int *i=&j;
在这里,您将i 声明为int *,并分配j 的地址。
*i=&j;
不过,在这种情况下,您已经声明了i,并且您将&j 分配给i 指向的位置,而不是i 本身。所以这是一个错误。另一个是i 还没有指向任何东西,因为你还没有初始化它。如果你想让i 指向j,你应该删除*:
i = &j;
【解决方案4】:
i 自身 被声明为“指向int 的指针”。所以你应该写i = &j;给它分配j的地址。
在您的情况下,*i = &j 在分配之前取消引用它,也就是说,指针的值被分配给位于合法或非法内存块中的 int,因为 i 未初始化。
请注意,访问未初始化的变量会导致未定义的行为,更不用说访问未初始化的指针指向的对象了。
【解决方案5】:
这是一个带有初始化的整数变量i的简单声明:
int i = 10;
通常很容易将声明和初始化分开:
int i;
/* ... */
i = 10;
没关系。但是 C 中指针声明的语法是不寻常的,它在处理声明和初始化时会导致一些不对称。你可以写
int *i = &j; /* correct */
但是如果你把它分开,* 不会一起标记,因为它是声明的一部分。
int *i;
/* ... */
i = &j; /* right */
*i = &j; /* WRONG */
【解决方案6】:
int *i;
您已将i 声明为指向int 的指针,但您尚未将其设置为指向到 任何东西; i 的值是不确定1。它将包含一些(很可能)不对应于有效地址2 的随机位串。此时尝试取消引用i 会导致未定义的行为,这可能意味着从彻底崩溃到损坏的数据到正常工作而没有任何明显问题的任何事情。
线
*i = &j;
有两个问题,第一个是i 没有指向任何有意义的地方(这无疑是您的运行时错误的来源;您正在尝试访问无效地址)。二是*i和&j的types不匹配; *i 的类型为 int,而 &j 的类型为 int *。
- 没有
static 关键字的函数本地声明的变量具有自动存储持续时间,并且不会隐式初始化为任何特定值。在没有显式初始化程序的情况下,不要假设任何此类变量最初设置为 0 或 NULL。在任何函数体之外或使用 static 关键字声明的变量具有静态存储持续时间,并且在没有显式初始化程序的情况下,这些变量将被初始化为 0 或 NULL。
- “有效”是指在程序中定义的对象的地址(即,另一个变量,或通过 `malloc` 分配的一块内存等)或平台定义的众所周知的地址(例如固定的硬件输入地址)。
NULL 是一个定义明确的无效地址,易于测试。