以下程序的输出未给出预期结果:
#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;
}
在 * x = 10,* y = 45
在 * x = 10,* y = 10
[以0.7秒完成]
在将* y分配给* x后,为什么* y = 10?
答案 0 :(得分:2)
程序具有未定义的行为,因为指针x
和y
未初始化且具有不确定的值。
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;
}