c - 指针给出了意想不到的值(value)

标签 c pointers initialization undefined-behavior

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;

您的代码仍然打印正确的值这一事实是未定义行为的一部分。未定义行为的表现方式之一是代码看起来工作正常,但随后看似不相关的更改将导致其崩溃。

在这种特殊情况下,函数firstsecond每个定义了 2 个相同类型和相同顺序的局部变量。调用first后完成后,包含 x 值的内存和p from 该函数仍然包含这些值,但尚未有其他函数调用来覆盖它们。

当您调用second时紧接着 first 。变量xptrsecond最终使用与 x 相同的内存和pfirst 。因为ptr未初始化,它仍然包含旧值,即x的地址首先,它恰好与x的地址相同。在second .

同样,这是未定义的行为,因此您不能依赖这种情况一直发生。如果您将另一个变量添加到 first或在 first 之间调用另一个函数和second ,这将修改 first 之前使用的堆栈内存。然后内存将包含一些其他值,您可能会打印垃圾值或核心转储。

如果使用不同的编译器或不同的编译器选项编译相同的代码可能会产生不同的结果。例如,另一个编译器可能会选择将每个函数中的变量以不同的顺序放在堆栈上,或者可能会决定在函数返回后将函数使用的堆栈清零。

关于c - 指针给出了意想不到的值(value),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38747751/

相关文章:

ios - 变量闭包初始化问题

java - 明星二级Java类

c - 将 C 数组拆分为 n 个相等的部分

c - 将值从文本文件传递到数组

C 预处理器指令常见问题解答

c - 我的 OpenCL 代码基于一个看似 noop 更改输出

C将字符串解析为没有任何lib函数的字符数组

c++ - 使用 NULL 值初始化静态函数数组

c - 如何声明指向文件的动态指针数组

c++ - 如何实现用gcc-4.4编译的大 vector 初始化?