void first(){
int x;
int *p;
p= &x;
scanf("%d",p);
printf("The value in x or *p is: %d\n",x);
}
void second(){
int x;
int *ptr;
scanf("%d",&x);
printf("The value in *ptr is: %d\n",*ptr);
}
int main(){
first();
second();
}
在上面的代码中,second()
函数表现不佳。我为 x
变量指定的值将被分配给 *ptr
以及 x.为什么?
最佳答案
您没有分配p
一个值,因此它保持未初始化状态。尝试取消引用该指针会调用 undefined behavior .
给p
一个值,您将得到您期望的结果:
int *p = &x;
您的代码仍然打印正确的值这一事实是未定义行为的一部分。未定义行为的表现方式之一是代码看起来工作正常,但随后看似不相关的更改将导致其崩溃。
在这种特殊情况下,函数first
和second
每个定义了 2 个相同类型和相同顺序的局部变量。调用first
后完成后,包含 x
值的内存和p
from 该函数仍然包含这些值,但尚未有其他函数调用来覆盖它们。
当您调用second
时紧接着 first
。变量x
和ptr
在second
最终使用与 x
相同的内存和p
在first
。因为ptr
未初始化,它仍然包含旧值,即x
的地址首先,它恰好与x
的地址相同。在second
.
同样,这是未定义的行为,因此您不能依赖这种情况一直发生。如果您将另一个变量添加到 first
或在 first
之间调用另一个函数和second
,这将修改 first
之前使用的堆栈内存。然后内存将包含一些其他值,您可能会打印垃圾值或核心转储。
如果使用不同的编译器或不同的编译器选项编译相同的代码可能会产生不同的结果。例如,另一个编译器可能会选择将每个函数中的变量以不同的顺序放在堆栈上,或者可能会决定在函数返回后将函数使用的堆栈清零。
关于c - 指针给出了意想不到的值(value),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38747751/