输出为: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;
}
我理解指针取消引用导致错误。但是这是怎么回事?
答案 0 :(得分:3)
因为您使用的是未初始化的指针。
您的\[
\overset{\displaystyle V_{1} \longrightarrow X_{1}} {V_{2} \longrightarrow X_{2}} \qquad
\]
应为*i = &j
答案 1 :(得分:1)
这将i
定义为int *
,并将其值设置为j
的地址:
int *i=&j;
这会将i
定义为int *
,然后尝试将i
指向的内容设置为j
的地址:
int *i;
int j=10;
*i=&j;
最终*i = ...
正在尝试取消引用未初始化的变量。
答案 2 :(得分:0)
i
本身被声明为“指向int
的指针”。因此,您应该写i = &j;
为其分配地址j
。
在你的情况下,*i = &j
在赋值之前取消引用它,也就是说,指针的值被分配给int
,它位于合法或非法的内存块中,因为{{1没有初始化。
请注意,访问未初始化的变量会导致未定义的行为,更不用说访问未初始化的指针所指向的对象。
答案 3 :(得分:0)
int *i=&j;
在此,您要声明i
为int *
,并指定j
的地址。
*i=&j;
在这种情况下,您已经宣布i
,并且您已将&j
分配到i
指向的位置,而不是i
1}}本身。这是一个错误。另一个原因是i
并未指向任何内容,因为您尚未对其进行初始化。如果您希望i
指向j
,则应删除*
:
i = &j;
答案 4 :(得分:0)
这是一个简单的声明,带有初始化,整数变量i
:
int i = 10;
通常,分割声明和初始化非常容易:
int i;
/* ... */
i = 10;
没关系。但是C中指针声明的语法是不寻常的,并且在处理声明和初始化时会导致一些不对称。你可以写
int *i = &j; /* correct */
但如果你把它拆开,*
就不会标记,因为它是声明的一部分。
int *i;
/* ... */
i = &j; /* right */
*i = &j; /* WRONG */
答案 5 :(得分:0)
int *i;
您已将i
声明为int
的指针,但您尚未将其设置为指向任何内容; i
的值是不确定 1 。它将包含一些随机的位串(最有可能)与有效地址 2 不对应。此时尝试取消引用i
会导致未定义的行为,这可能意味着从完全崩溃到损坏的数据再到没有任何明显问题的工作。
该行
*i = &j;
有两个问题,第一个问题是i
没有指向任何有意义的问题(而这正是你的运行时错误无疑来自的地方;你是' re试图访问无效的地址)。第二个是*i
和&j
的类型不匹配; *i
的类型为int
,而&j
的类型为int *
。
<小时/>
static
关键字的函数本地声明的变量具有自动存储持续时间,并且不会隐式初始化为任何特定值。在没有显式初始化器的情况下,不要假设任何此类变量最初设置为0或NULL
。在任何函数体之外或使用static
关键字声明的变量具有静态存储持续时间,并且在没有显式初始化程序的情况下,这些变量将初始化为0或NULL
。
NULL
是一个定义明确的无效地址,很容易被测试。