几年前我在使用 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
前两行输出是一些垃圾值吗?这里到底发生了什么,我怎样才能得到正确的输出?
最佳答案
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()
此外,在 main
的末尾添加返回值 return 0;
。
函数声明:
您应该在 main
之前正确声明函数 swap()
:
void swap(int *x,int *y);
在代码中使用函数的地方之前提供函数声明,使编译器有机会匹配参数并报告传递的错误类型。
进一步使用 malloc
因为你不会实现你想要实现的目标,你根本不需要在这里使用 malloc
并且应该始终避免使用它越多越好。
另外,你应该拿起一个 good book 并学习基础知识。
关于c - 使用指针交换两个数字的程序出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9511030/