微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在Windows中使用cygwin编译的C程序工作,Linux下的分段故障. cygwin GCC“坏”吗?

对于我的编程102类,我们被要求提供在 Linux下编译和运行的C代码.我的硬盘驱动器上没有足够的空间在Windows上安装Linux,所以我使用cygwin编译我的程序.

最新的程序,我不得不在编译和运行在cygwin下罚款.它在Linux下编译得很好,但通过执行的中途就会产生一个分段错误.我向提供给我们课程的研究生说明了这一点,他说cygwin的GCC版本允许编译和执行更为简单的代码.

我通过谷歌发现的几个参考文献并不是决定性的.我发现一个线程说,Linux下的seg故障原因是内存泄漏.为什么这不影响cygwin版本?

我会使用大学的电脑,但我不能使用Subversion来显着阻碍我的努力. (我是新的编码,通常需要能够恢复到X版本).

cygwin的GCC版本是否真的比较容易编译的代码?如果是,编码时有什么明显的问题要注意吗?有没有办法可以编写将在Linux下运行的代码

编辑

感谢您的回复.在我的原始帖子中我没有明确的说明:我的代码中有一个错误,对我而言是非常重要的(我对编程非常新颖,毕竟对C来说真的是绿色的).我的TA意味着cygwin的GCC是一个不太可靠的编译器,允许运行比GNU / Linux下的代码更多的代码.我发现这是奇怪的,所以在互联网上搜索,但是找不到任何参考.

不仅仅是指责编译器和我的代码,我想知道程序在Windows下运行的原因是什么,在Linux下运行.回复:Windows / Linux下的不同内存管理器和堆/堆栈布局在这方面正在说明.

Cygwin的GCC的结论与GNU / Linux的“好”一样,它的底层操作系统/纯粹的运气,我的buggy程序运行在一个而不是另一个是非常正确的?

关于发布源代码,这是一个家庭作业,所以我宁愿自己找到问题,如果可能的话:)

编辑2

我接受了Jalf的回答,因为它谈到了什么使程序在Windows下运行,而不是在Linux下运行,这是我真正想知道的.感谢所有贡献的人,他们都是非常有趣和翔实的回复.

当我发现问题并修复它,我会上传一个zip文件与这个非工作版本的所有源代码,以防万一有人好奇,看看我做了什么:)

编辑3

对于那些有兴趣看到代码的人,我发现了这个问题,这的确是由于指针.我试图从函数返回一个指针.正在尝试返回的指针正被声明在函数内,所以一旦执行函数就被破坏.有问题的代码在第22-24行被注释掉.

随意嘲笑我的代码.

/**
*  Returns array of valid searches based on current coordinate
*/
void determine_searches(int row,int col,int last_row,int last_col,int *active_search){
    // define coordinate categories and related valid search directions
    int Library0[] = {2,3,4,-1};
    int Library1[] = {4,5,6,-1};
    int Library2[] = {2,-1};
    int Library3[] = {0,1,2,7,-1};
    int Library4[] = {0,-1};
    int Library5[] = {0,-1};
    int Library6[] = {0,-1};
    int Library7[] = {0,-1};
    int Library8[] = {0,-1};

    int * Library[] = { 
        Library0,Library1,Library2,Library3,Library4,Library5,Library6,Library7,Library8,};

    // declare (and assign memory to) the array of valid search directions that will be returned
    //int *active_search;
    //active_search = (int *) malloc(SEARCH_DIRECTIONS * sizeof(int));


    // determine which is the correct array of search directions based on the current coordinate
    // top left corner
        int i = 0;
    if(row == 0 && col == 0){
        while(Library[0][i] != -1){
            active_search[i] = Library[0][i];
            i++;
        }
    }
    // top right corner
    else if(row == 0 && col == last_col){
        while(Library[1][i] != -1){
            active_search[i] = Library[1][i];
            i++;
        }
    }
    // non-edge columns of first row
    else if(row == 0 && (col != 0 || col != last_col)){
        while(Library[2][i] != -1){
            active_search[i] = Library[2][i];
            i++;
        }
    }
    // non-edge coordinates (no edge columns nor rows)
    else if(row != 0 && row != last_row && col != 0 && col != last_col){
        while(Library[3][i] != -1){
            active_search[i] = Library[3][i];
            i++;
        }
    }
    // bottom left corner
    else if(row == last_row && col == 0){
        while(Library[4][i] != -1){
            active_search[i] = Library[4][i];
            i++;
        }
    }
    // bottom right corner
    else if(row == last_row && col == last_col){
        while(Library[5][i] != -1){
            active_search[i] = Library[5][i];
            i++;
        }
    }
    // non-edge columns of last row
    else if(row == last_row && (col != 0 || col != last_col)){
        while(Library[6][i] != -1){
            active_search[i] = Library[6][i];
            i++;
        }
    }
    // non-edge rows of first column
    else if((row != 0 || row != last_row) && col == 0){
        while(Library[7][i] != -1){
            active_search[i] = Library[7][i];
            i++;
        }
    }
    // non-edge rows of last column
    else if((row != 0 || row != last_row) && col == last_col){
        while(Library[8][i] != -1){
            active_search[i] = Library[8][i];
            i++;
        }
    }
    active_search[i] = -1;
}
像其他人一样,您可能想在这里发布一些代码,即使这不是您的问题的真正点.让每个人都可以通过代码查看是否可以找到导致segfault的原因,这可能还是一个很好的学习体验.

但是,是的,问题在于影响C程序的平台依赖性以及基本随机的因素.虚拟内存意味着有时,访问未分配的内存将会似乎正常工作,因为您打到一个未被部分的页面被分配在一些较早的时间点.其他时候,它会分裂,因为你打了一个页面,根本没有分配给你的进程.这是真的不可能预测.这取决于你的记忆分配在哪里,是在页面的边缘还是在中间?这取决于操作系统和内存管理器,哪些页面已经分配到目前为止,……你得到了这个想法.不同的编译器,不同版本的同一编译器,不同的操作系统,不同的软件,驱动程序或硬件安装在系统上,任何事情都可以改变,无论您是否在访问未分配的内存时遇到segfault.

至于电讯管理局局长声称cygwin更为“松懈”,就是垃圾,原因很简单.编译器都没有抓到错误!如果“本地”GCC编译器真的不那么松懈,那么在编译时会给你一个错误. Segfaults不是由编译器生成的.编译器没有多少可以做,以确保您获得一个segfault而不是一个似乎有效的程序.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐