我尝试通过调用insort函数来实现插入算法。不知怎的,一路上我犯了一些错误,终端打印出分段错误。请帮忙。谢谢!
int
main(int argv,char *argc[]){
int A[argv-2];
for(int i=1;i<argv;i++){
A[i-1]=atoi(*(argc+i));
}
insort(&A,argv-1,0);
for(int i=0;i<argv-1;i++){
printf("%d",A[i]);
}
printf("\n");
return 0;
}
int
insort(int *A[],int size,int n){
int temp;
if(n<size){
for(int i=n;i>=0 && *(A+i)>*(A+i-1);i--){
temp=*(A+i-1);
*(A+i-1)=*(A+i);
*(A+i)=temp;
}
}
return insort(A,size,n++);
}
答案 0 :(得分:3)
编译任何程序时,请注意编译器发出的警告。
对于每个警告,您必须了解它的原因以及如何正确修复它。
$ gcc -std=c99 insort.c
insort.c:7:9: warning: implicit declaration of function 'atoi' [-Wimplicit-function-declaration]
insort.c:11:9: warning: implicit declaration of function 'printf' [-Wimplicit-function-declaration]
要解决这些问题,请在最上方插入以下行:
#include <stdio.h> // for printf
#include <stdlib.h> // for atoi
下一个:
insort.c:10:5: warning: implicit declaration of function 'insort' [-Wimplicit-function-declaration]
要解决此问题,请将整个insort
函数移到main
函数上方。
下一个:
insort.c:23:17: warning: assignment makes integer from pointer without a cast
这个真的很糟糕。参数int *A[]
实际上意味着int **A
,它是指向int的指针。要解决此问题,请删除方括号。
下一个:
insort.c:22:12: warning: passing argument 1 of 'insort' from incompatible pointer type
&
运算符不是必需的。将数组传递给函数时,它会衰减为指向数组开头的指针。删除&
。
现在,程序编译时没有给出任何警告。非常好。下一级:
$ gcc -std=c99 -Wall -Wextra -Os insort.c
哇。即使启用了所有这些警告,编译器也不会再抱怨了。那很好。
(-Os
优化选项是启用某些警告所必需的,因为它们仅在编译器优化代码时进行测试。)
现在程序编译。在运行它时,似乎陷入了无限循环。但是最糟糕的错误现在已经解决了。