_温水青蛙_ 2017-06-13 06:39 采纳率: 100%
浏览 1466
已采纳

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

#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条回答 默认 最新

  • _温水青蛙_ 2017-06-13 18:41
    关注

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)
编辑
预览

报告相同问题?

手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部