几年前,我正在使用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
前两行输出有些垃圾值吗?究竟发生了什么,我怎样才能得到正确的输出?
答案 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)
这里没有什么是正确的。
swap
的参数是文字地址2和3.您可以在通话中&a
和&b
。printf
中的swap
正在打印指针地址,因此输出为&#34;预期&#34;。malloc
(为什么?),则只分配2个字节。 int通常为4,但请使用sizeof
。答案 2 :(得分:1)
您传递变量值并使用指针接收变量。
`swap(a,b) `
应为swap(&a,&b)
因为你必须传递变量的地址,而不是变量本身。阅读C中的参考呼叫。