sinat_28704977
_温水青蛙_
采纳率100%
2017-06-13 14:39 阅读 1.4k
已采纳

同样一个程序vc编译后可以运行gcc编译后不能运行

1
#include<stdio.h> 
// 打印结果 
void Show(int arr[], int n) 
{ 
    int i; 
    for ( i=0; i<n; i++ ) 
    printf("%d ", arr[i]); 
    printf("\n"); 
} 

//希尔排序 按从小到大排序 
void ShellSort(int arr[], int n) 
{ 
    int i, j, k; 
    int temp, gap; 

    for (gap = n / 2; gap > 0; gap /= 2) //步长的选取 
        { 
                for (i = 0; i < gap; i++) //直接插入排序原理 
                    { 
                            for (j = i+gap; j < n; j += gap) //每次加上步长,即按列排序。 
                                    {
                                                temp=arr[j];
                                                for(k=j;k>0&&arr[k-gap]>temp;k-=gap)
                                                        {
                                                                arr[k]=arr[k-gap];
                                                        }
                                                arr[k]=temp;
                                    }
                    }
        }
}

int main()
{
    int arr_test[13]={81,94,11,96,12,35,17,95,28,58,41,75,15};
    Show(arr_test,13);
    ShellSort(arr_test,13);
    Show(arr_test,13);
    return 0;
}

以上为程序清单,在Windows上vs2015可以正确运行,但在Ubuntu14.04下,终端输入gcc -o shellsort shellsort.c成功编译,但在运行时出现错误:81 94 11 96 12 35 17 95 28 58 41 75 15
段错误 (核心已转储)
,是啥情况?

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

3条回答 默认 最新

  • 已采纳
    sinat_28704977 _温水青蛙_ 2017-06-14 02:41

    自己回答,就是数组越界,在最内层循环时,会遇到k-gap<0的情况,此时查看发现arr{k-gap】为一个特别大的值,进入循环导致出错。
    但是在vs下,就这个程序而言,越界的数组值均为一个极小的负值,不会进入循环,因此不会出错

    点赞 评论 复制链接分享
  • caozhy 从今以后生命中的每一秒都属于我爱的人 2017-06-13 16:05

    仔细调试,arr[k]=arr[k-gap]; 这里有没有出现数组下标越界

    点赞 评论 复制链接分享
  • sinat_28704977 _温水青蛙_ 2017-06-14 01:31

    隐隐感觉到蛋蛋的忧伤

    点赞 评论 复制链接分享

相关推荐