使用指针交换两个数字的程序出错

时间:2012-03-01 05:21:39

标签: c

几年前,我正在使用Turbo C编译器,以下代码正常工作。

#include<stdio.h>
void main()
{
     int a=2,b=3;
     swap(a,b);
     printf("%d\n%d\n",a,b);
}

swap(int *x,int *y)
{
     int t;
     //x=malloc(2);
     //y=malloc(2);
     t=*x;
     *x=*y;
     *y=t;
     printf("%d\n%d\n",x,y);
}

现在我正在研究cygwin,如果我运行此代码,我会收到错误Segmentation fault(core dumped) 如果我取消注释malloc语句,我得到输出

536937064
536937080
2
3

前两行输出有些垃圾值吗?究竟发生了什么,我怎样才能得到正确的输出?

3 个答案:

答案 0 :(得分:3)

Here 是您的程序的更正版本,可以正确执行。

您发布的示例中存在许多问题:

传递的参数类型不正确:

swap(a,b); 

应该是:

swap(&a,&b); 

你的函数需要修改指向整数的指针,你没有这样做。


printf的格式说明符不正确:

printf("%d\n%d\n",x,y); 

应该是:

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

printf不是类型安全的,您需要确保在使用时使用正确的格式说明符。使用不正确的格式说明符会导致未定义的行为


接下来的两个是好的做法,如果不是错误,你应该遵循它们。

main()的回复类型不正确:

根据标准,程序应返回int

void main()

应该是

int main()

此外,在return 0;的末尾添加一个值main


功能声明:

您应该在swap()之前正确声明函数main

void swap(int *x,int *y); 

在代码中使用函数声明之前提供函数声明,使编译器有机会匹配参数并报告传递的错误类型。


进一步使用malloc将无法实现您想要实现的目标,您根本不需要在此使用malloc,并且应该始终尽量避免使用它。

此外,您应该选择 good book 并学习基础知识。

答案 1 :(得分:2)

这里没有什么是正确的。

  1. swap的参数是文字地址2和3.您可以在通话中&a&b
  2. printf中的
  3. swap正在打印指针地址,因此输出为&#34;预期&#34;。
  4. 如果您使用malloc(为什么?),则只分配2个字节。 int通常为4,但请使用sizeof

答案 2 :(得分:1)

您传递变量值并使用指针接收变量。

`swap(a,b) `

应为swap(&a,&b)

因为你必须传递变量的地址,而不是变量本身。阅读C中的参考呼叫。