[英]Why am i getting this segmentation fault error?
我正在嘗試使用此代碼以特定方式對數組進行坐標處理,但是我總是在第25行遇到分段錯誤,但是我不明白為什么。
#include <stdio.h>
#include <stdlib.h>
void bq(int* v, int s, int e);
int main(void){
int* v;
for(int i = 10; i <= 30; i = i + 10){
v = (int*) malloc (i*sizeof(int));
for(int j = 0; j < i; j++)
v[j] = j;
bq(v, 0, i-1);
for (int k = 0; k < i; k++){
printf("%d ", v[k]);
}
free(v);
printf("\n");
}
return 0;
}
void bq(int* v, int s, int e){
if (e+s+1 > 2){
int m = (e+s+1) / 2;
bq(v, m+1, e);
bq(v, s, m-1);
int aux = v[e];
v[e] = v[m];
v[m] = aux;
}
}
在bq
函數頂部添加一個printf
語句:
void bq(int* v, int s, int e) {
printf("e=%d, s=%d, e+s+1=%d\n", e, s, e + s + 1);
if (e + s + 1 > 2) {
運行程序時,您將看到輸出。
e=9, s=0, e+s+1=10
e=9, s=6, e+s+1=16
e=9, s=9, e+s+1=19
e=9, s=10, e+s+1=20
e=9, s=11, e+s+1=21
e=9, s=11, e+s+1=21
e=9, s=11, e+s+1=21
e=9, s=11, e+s+1=21
e=9, s=11, e+s+1=21
e=9, s=11, e+s+1=21
e=9, s=11, e+s+1=21
e=9, s=11, e+s+1=21
e=9, s=11, e+s+1=21
e=9, s=11, e+s+1=21
...
換句話說, bq
函數收斂到只是使用相同的參數bq(v, 9, 11)
遞歸調用自身。 但是由於9+11+1
始終大於2
,所以它處於無限遞歸循環中。 否則稱為堆棧溢出。 最終結果是堆棧內存不足,程序崩潰。
我的心理力量建議這一行:
if (e+s+1 > 2){
旨在表達“如果我在v [s..e]范圍內至少有兩個元素”。 在這種情況下,它應顯示為:
if (e-s+1 > 2){
不確定程序的其余部分是否正確,但這只是一個開始。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.