C指针值 - LHS值的意外更改

时间:2015-07-11 08:14:47

标签: c pointers

以下程序的输出未给出预期结果:

#include <stdio.h>

int main()
{
    int *x;
    int *y;
    *x  = 10;
    *y = 45;

    printf("Before\n");
    printf("*x = %d, *y = %d\n\n",*x, *y);
    *x = *y;
    printf("After\n");
    printf("*x = %d, *y = %d\n\n",*x, *y);

    return 0;
}

构建结果(mingw32-g ++。exe):

在 * x = 10,* y = 45

在 * x = 10,* y = 10

[以0.7秒完成]

在将* y分配给* x后,为什么* y = 10?

3 个答案:

答案 0 :(得分:2)

程序具有未定义的行为,因为指针xy未初始化且具有不确定的值。

int *x;
int *y;

你应该写这样的东西(如果是C程序)

int *x = malloc( sizeof( int ) );
int *y = malloc( sizeof( int ) );

*x = 10;
*y = 45;

//...

free( y );
free( x );

或者你必须使用operator new和delete,如果它是一个C ++程序

int *x = new int();
int *y = new int();

*x = 10;
*y = 45;

//...

delete y;
delete x;

在C ++中,您还可以使用智能指针。例如

#include <iostream>
#include <memory>

int main()
{
    std::unique_ptr<int> x( new int( 10 ) );
    std::unique_ptr<int> y( new int( 45 ) );

    std::cout << "Before: *x = " << *x << ", *y = " << *y << std::endl;

    *x = *y;

    std::cout << "After:  *x = " << *x << ", *y = " << *y << std::endl;
}    

您将获得预期的结果

Before: *x = 10, *y = 45
After:  *x = 45, *y = 45

使用智能指针的好处是你不必费心去删除它们。

答案 1 :(得分:1)

这是因为你没有初始化指针的任何内存地址。 因此,未定义的行为占优势。程序为指向指向的指针分配一个随机内存块。

尝试这一点,您将收到运行时错误。这里没有随机记忆 提供给指向的指针。因此解除引用 指针导致运行时错误:

#include <stdio.h>

int main()
{
    int *x = NULL;
    int *y = NULL;
    *x  = 10;
    *y = 45;

    printf("Before\n");
    printf("*x = %d, *y = %d\n\n",*x, *y);
    *x = *y;
    printf("After\n");
    printf("*x = %d, *y = %d\n\n",*x, *y);

    return 0;
}

现在尝试一下。这应该会给你预期的结果:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int *x = malloc(sizeof(int));
    int *y = malloc(sizeof(int));
    *x  = 10;
    *y = 45;

    printf("Before\n");
    printf("*x = %d, *y = %d\n\n",*x, *y);
    *x = *y;
    printf("After\n");
    printf("*x = %d, *y = %d\n\n",*x, *y);

    return 0;
}

答案 2 :(得分:0)

您没有初始化指针,以及未定义的行为。

这将在您的示例中给出预期结果:

int main()
{
    int a, b;
    int *x = &a, *y = &b;

    *x = 10;
    *y = 45;

    std::cout << *x << " " << *y << std::endl;

    *x = *y;

    std::cout << *x << " " << *y << std::endl;

    return 0;
}