我悲剧了。。。段错误。。。
usrbin吧
全部回复
仅看楼主
level 11
铁砣陈 楼主
#include<stdio.h>
#define N 8
int a[N];
int merge(int start, int mid, int end)
{
int n1 = mid+1-start;
int n2 = end-mid;
int right[n1],left[n2];
int i,j,k;
for(i=0; i<n1; i++)
left[i] = a[start+i];
for(j=0; j<n2; j++)
right[j] = a[mid+1+j];
i=j=0;
for(k=0; i<n1 && j<n2; k++)
if(right[i]<left[j]){
a[start+k]=right[i];
i++;
} else {
a[start+k]=left[j];
j++;
}
for(; i<n1;){
a[start+k]=right[i];
k++;
i++;
}
for(; j<n2;){
a[start+k]=left[j];
k++;
i++;
}
return 0;
}
int sort(int start, int end)
{
if(start<end){
int mid = (start+end)/2;
sort(start, mid);
sort(mid+1, end);
merge(start, mid, end);
}
return 0;
}
int main()
{
int i;
while(1){
for(i=0; i<N;i++)scanf("%d",&a[i]);
sort(0,7);
for(i=0; i<N;i++)printf("%d ",a[i]);
}
}

2011年08月26日 05点08分 1
level 11
铁砣陈 楼主
2011年08月26日 05点08分 2
level 11
铁砣陈 楼主
-Wall选项没有警告。。。
gdb显示:
Program received signal SIGSEGV, Segmentation fault.
0x080485a1 in merge (start=6, mid=6, end=7) at merge_sort.c:35
35 a[start+k]=left[j];
不过貌似我在这里没发现有什么问题啊。。。[囧]
2011年08月26日 05点08分 3
level 11
铁砣陈 楼主
不对。。。应该是
Program received signal SIGSEGV, Segmentation fault.
0x080485a1 in merge (start=2, mid=2, end=3) at merge_sort.c:35
35 a[start+k]=left[j];
2011年08月26日 05点08分 4
level 8
int merge(int start, int mid, int end)
{
int n1 = mid+1-start;
int n2 = end-mid;
int right[n1],left[n2];这能用变量定义数组?[歪头]
int i,j,k;
2011年08月26日 05点08分 5
level 11
铁砣陈 楼主
可以的,C99标准,可变长数组
2011年08月26日 06点08分 6
level 11
for(; j<n2;){
a[start+k]=left[j];
k++;
i++;
}
============================
瞪大眼睛看吧,错就在这里
2011年08月26日 06点08分 7
level 11
铁砣陈 楼主
linuxuser@linuxuser-VirtualBox:~$ gdb main
GNU gdb (Ubuntu/Linaro 7.2-1ubuntu11) 7.2
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "i686-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/linuxuser/main...done.
(gdb) start
Temporary breakpoint 1 at 0x8048638: file merge_sort.c, line 60.
Starting program: /home/linuxuser/main
Temporary breakpoint 1, main () at merge_sort.c:60
60 for(i=0; i<N;i++)scanf("%d",&a[i]);
(gdb) s
2
54
7
1
6
8
3
45
61 sort(0,7);
(gdb) s
sort (start=0, end=7) at merge_sort.c:45
45 if(start<end){
(gdb) display end
1: end = 7
(gdb) display mid
No symbol "mid" in current context.
(gdb) display start
2: start = 0
(gdb) s
46 int mid = (start+end)/2;
2: start = 0
1: end = 7
(gdb)
47 sort(start, mid);
2: start = 0
1: end = 7
(gdb) display mid
3: mid = 3
(gdb) s
sort (start=0, end=3) at merge_sort.c:45
45 if(start<end){
2: start = 0
1: end = 3
(gdb)
46 int mid = (start+end)/2;
3: mid = -1073745998
2: start = 0
1: end = 3
(gdb)
47 sort(start, mid);
3: mid = 1
2: start = 0
1: end = 3
(gdb)
sort (start=0, end=1) at merge_sort.c:45
45 if(start<end){
2: start = 0
1: end = 1
(gdb)
46 int mid = (start+end)/2;
3: mid = 1153401
2: start = 0
1: end = 1
(gdb)
47 sort(start, mid);
3: mid = 0
2: start = 0
1: end = 1
(gdb)
sort (start=0, end=0) at merge_sort.c:45
45 if(start<end){
2: start = 0
1: end = 0
(gdb)
52 return 0;
2: start = 0
1: end = 0
(gdb) finish
Run till exit from #0 sort (start=0, end=0) at merge_sort.c:52
sort (start=0, end=1) at merge_sort.c:48
48 sort(mid+1, end);
3: mid = 0
2: start = 0
1: end = 1
Value returned is $1 = 0
(gdb) s
sort (start=1, end=1) at merge_sort.c:45
45 if(start<end){
2: start = 1
1: end = 1
(gdb) finish
Run till exit from #0 sort (start=1, end=1) at merge_sort.c:45
sort (start=0, end=1) at merge_sort.c:49
49 merge(start, mid, end);
3: mid = 0
2: start = 0
1: end = 1
Value returned is $2 = 0
(gdb) s
merge (start=0, mid=0, end=1) at merge_sort.c:6 @@@@@@@这里@@@@
6 {
(gdb)
7 int n1 = mid+1-start;
(gdb)
8 int n2 = end-mid;
(gdb)
9 int right[n1],left[n2];
(gdb)
12 for(i=0; i<n1; i++)
(gdb)
13 left[i] = a[start+i];
(gdb)
12 for(i=0; i<n1; i++)
(gdb)
14 for(j=0; j<n2; j++)
(gdb)
15 right[j] = a[mid+1+j];
(gdb)
14 for(j=0; j<n2; j++)
(gdb)
17 i=j=0;
(gdb)
19 for(k=0; i<n1 && j<n2; k++)
(gdb)
20 if(right[i]<left[j]){
(gdb) finish
Run till exit from #0 merge (start=0, mid=0, end=1) at merge_sort.c:20
sort (start=0, end=1) at merge_sort.c:52
52 return 0;
2: start = 0
1: end = 1
Value returned is $3 = 0
你看,在merge (start=0, mid=0, end=1) at merge_sort.c:6这里面没有出现段错误。。
2011年08月26日 06点08分 8
level 11
铁砣陈 楼主
gdb也是报到这里,不过没看出什么问题啊。。。貌似
2011年08月26日 06点08分 9
level 11
7L那里第四行是i++ 还是 j++,你先回答我这个问题
2011年08月26日 06点08分 10
level 11
铁砣陈 楼主
[啊!][拍砖][囧][瀑布汗~][瘫坐][砍死你][晕]终于知道问题所在了。。。
2011年08月26日 06点08分 11
level 11
[大笑]好好练习调试程序的能力吧,这么简单的错误都看不出来啊
2011年08月26日 06点08分 12
level 11
铁砣陈 楼主
恩,感觉最难到就是调试了,调试成本太高了。。。[88]
2011年08月26日 06点08分 13
1