为什么使用指针交换价值不起作用?

时间:2014-10-13 12:32:50

标签: c++ c function pointers

我写了以下代码。它应该交换两个变量的值...但是,一旦我编译代码,它就会显示swap.exe已停止工作...
为什么它不起作用?

#include<cstdio>
#include<iostream>
using namespace std;
void swap(int *x, int *y)
{
    int *temp;
    *temp=*x;
    *x=*y;
    *y=*temp;
}
int main()
{
    int i=5,j=10;
    swap(&i,&j);
    cout<<i<<" "<<j<<endl;

    return 0;
}

如何解决这个问题? 我的代码出了什么问题?

5 个答案:

答案 0 :(得分:4)

更改为

void swap(int *x, int *y)
{
    int temp;
    temp=*x;
    *x=*y;
    *y=temp;
}

如果要交换两个int,为什么要使用指向int的指针作为临时变量?使用相同的类型。

答案 1 :(得分:3)

因为temp是一个悬空指针,所以访问*temp是未定义的行为。

您可以使用int temp;temp = *x; ...,或只使用std::swap

答案 2 :(得分:3)

它不起作用,因为您将x的内容复制到未初始化指针(temp)指向的位置。

如果您只想交换xy的内容,可以使用std::swap(*x, *y)

答案 3 :(得分:2)

使用temp作为int而不是int *,如:

void swap(int *x, int *y)
{
    int temp;
    temp=*x;
    *x=*y;
    *y=temp;
}

答案 4 :(得分:0)

WITH MEMBER [Measures].[Closing Stock Date] AS IIF ( Ancestor ( StrToMember ( '[Date].[Retail].[Date].&[' + Format(Now(),'yyyy-MM-dd') + 'T00:00:00]' ) ,[Date].[Retail].CurrentMember.Level ) IS [Date].[Retail].CurrentMember ,StrToMember ( '[Date].[Retail].[Date].&[' + Format(Now(),'yyyy-MM-dd') + 'T00:00:00]' ) ,ClosingPeriod ( [Date].[Retail].[Date] ,[Date].[Retail].CurrentMember ) ).Name SELECT {[Measures].[Closing Stock Date]} ON COLUMNS FROM ( SELECT { [Date].[Retail].[Retail Period].&[Period 1, Ret 2014] ,[Date].[Retail].[Retail Period].&[Period 2, Ret 2014] ,[Date].[Retail].[Retail Period].&[Period 3, Ret 2014] ,[Date].[Retail].[Retail Period].&[Period 4, Ret 2014] ,[Date].[Retail].[Retail Period].&[Period 11, Ret 2014] ,[Date].[Retail].[Retail Period].&[Period 12, Ret 2014] } ON COLUMNS FROM [Retail] ) WHERE [Business Division].[Business Division].&[11]; 声明为int类型变量,而不是指针。因为你只是将x的值存储在temp中,而不是指向x。