带指针的C函数在一台计算机上工作,而在另一台计算机上不起作用

时间:2015-01-13 14:08:23

标签: c function pointers swap

#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);
}

我正在使用代码块,而且这段代码不起作用,我不明白为什么......在一台计算机上它运行得很好但在另一台计算机上它根本不会运行。 有帮助吗? 提前谢谢。

5 个答案:

答案 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