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

标签 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

前两行输出是一些垃圾值吗?这里到底发生了什么,我怎样才能得到正确的输出?

最佳答案

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/

相关文章:

c - 用 C 在屏幕上显示文件中的所有男人

c - 这个递归 GCD 函数正确吗?

PHP 扩展 : How to return a new class object

无法在头文件中分配结构变量

c - 具有二维数组段错误的结构在写入时

c - C 中的双向链表排序

c - 关于优化浮点计算的建议 : solving a quadratic equation

c - 用宏初始化结构

c - 递归函数如何返回 33?

c - 警告 :"initialization makes pointer from integer without a cast in c