使用插入排序时出现分段错误
Segmentation fault while using insertion sort
我尝试通过调用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++);
}
编译任何程序时,请注意编译器发出的警告。
对于每一个警告,您必须了解给出它的原因以及如何正确修复它。
$ 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
优化选项是启用某些警告所必需的,因为它们仅在编译器优化代码时进行测试。)
现在程序可以编译了。当 运行 它时,它似乎陷入了死循环。但最严重的错误现在已修复。
我尝试通过调用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++);
}
编译任何程序时,请注意编译器发出的警告。
对于每一个警告,您必须了解给出它的原因以及如何正确修复它。
$ 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
优化选项是启用某些警告所必需的,因为它们仅在编译器优化代码时进行测试。)
现在程序可以编译了。当 运行 它时,它似乎陷入了死循环。但最严重的错误现在已修复。