#include <stdio.h>
void swap (int *a, int *b)
{
int *tmp;
*tmp = *a;
*a = *b;
*b = *tmp;
}
int main ()
{
int x = 5;
int y = 7;
swap (&x,&y);
printf ("\n x = %d \n y = %d \n",x,y);
}
我正在使用代码块,而且这段代码不起作用,我不明白为什么......在一台计算机上它运行得很好但在另一台计算机上它根本不会运行。 有帮助吗? 提前谢谢。
答案 0 :(得分:7)
int tmp;
tmp = *a;
*a = *b;
*b = tmp;
您需要的是一个变量tmp
来存储值而不是指针*tmp
。
下面的代码真的很难做到这一点,但
int *tmp = malloc(sizeof(int));
*tmp = *a;
*a = *b;
*b = *tmp;
完成后请使用
释放内存free(tmp);
答案 1 :(得分:4)
Gopi已经纠正了您的代码 - 添加到之前的答案 - 我认为了解新手的信息很好:
第4.1节陈述:
a的左值(3.10) 非功能,非数组类型T即可 转换为右值。如果T是 不完整的类型,一个程序 需要这种转换是必要的 病态的。如果对象是哪个 左值引用不是类型的对象 T并不是一种类型的对象 派生自T,或如果对象是 未初始化,一个程序 需要进行此转换 未定义的行为。如果T是 非类型,右值的类型 是C的不合格版本的T. 否则,右值的类型是 吨。
当您尝试取消引用和未初始化指针时,行为未定义。未定义意味着任何事情都可能发生 - 无法保证。因此,您可以在不同的环境中获得不同的行为。
来自Wiki Making pointers safer
没有分配任何地址的指针称为野指针。任何使用此类未初始化指针的尝试都可能导致意外行为,原因可能是初始值不是有效地址,或者因为使用它可能会损坏程序的其他部分。结果通常是分段错误,存储违规或Wild分支(如果用作函数指针或分支地址)。
你在这里做了什么:
int *tmp;
*tmp = *a;
是你创建了一个指向int的指针,它没有指向任何东西 - 基本上它包含一些垃圾值(甚至可能是你的密码 - 谁知道)。
答案 2 :(得分:1)
你的错误是使用未初始化的内存。在使用之前始终为指针分配内存。接下来,在您完成后,不要忘记释放已分配的内存。
另外,您应在return 0;
功能的末尾添加main()
。
如果您不介意第二意见,请查看以下代码。
#include <stdio.h>
#include <stdlib.h>
void swap (int *a, int *b)
{
int *tmp = malloc(sizeof(*tmp));
*tmp = *a;
*a = *b;
*b = *tmp;
free(tmp);
}
int main ()
{
int x = 5;
int y = 7;
swap (&x,&y);
printf ("\n x = %d \n y = %d \n",x,y);
return 0;
}
答案 3 :(得分:0)
如果你想使用指针,虽然它根本没有任何意义
void swap(int *a, int *b)
{
int tmp[1];
*tmp = *a;
*a = *b;
*b = *tmp;
}
此处tmp
并非严格意义上的指针,但您可以在其上使用*
间接运算符。
或者
void swap(int *a, int *b)
{
int value = *a;
int *tmp = &value;
*tmp = *a;
*a = *b;
*b = *tmp;
}
或者您可以使用malloc
Gopi 指出。
答案 4 :(得分:0)
如果你想使用指针,那么请使用指针:
#include <stdio.h>
void swap (int ** ppx, int ** ppy)
{
int * p = *ppx;
*ppx = *ppy;
*ppy = p;
}
int main (void)
{
int x = 5;
int y = 7;
int * px = &x;
int * py = &y;
printf ("\nx = %d\ny = %d\n", *px, *py);
swap (&px, &py);
printf ("\nx = %d\ny = %d\n", *px, *py);
return 0;
}
结果:
x = 5
y = 7
x = 7
y = 5