int var获得奇异的价值

时间:2014-05-02 20:08:10

标签: c gcc int

Int值' j'当我不断尝试调试它时,会得到奇怪的结果。我不确定我的学校编译器是否存在问题,或者它是否是我的代码。谢谢您的帮助。

海湾合作委员会版本: 阅读/usr/local/lib/gcc-lib/sparc-sun-solaris2.7/2.95.2/specs中的规范 gcc版本2.95.2 19991024(发布)

我的代码片段搞砸了:

    void sFlag(DIR * dirp, int c, char *dirname)
    {
        struct dirent *dp;
        struct stat statbuf;
        struct stat statarray[c];
        struct stat tempstat;
        char fullfilename[MAXSZ];
        int i;
        int boo; 
        int j; /*<--------- variable that's messing up*/

        while((dp = readdir(dirp)) != NULL)
        {
            snprintf(fullfilename, MAXSZ, "%s/%s", dirname, dp->d_name);
            if(stat(fullfilename, &statbuf) == -1)
                printf("Could not read file %s\n", dp->d_name);
            else if(isHiddenFile(dp->d_name))
            {
                statarray[i] = statbuf;
                i++;
            }
        }
/*As far as i know all the code above works fine*/

 /*bubble sort that will sort array by logical file size*/
        while(boo)
        {
            j = 0;
            boo = 0;
            while(j < c)
            {
                fprintf(stderr, "%d\n", j);  /*print debug info*/
                if(statarray[j].st_size < statarray[j+1].st_size)
                {
                    tempstat = statarray[j];
                    statarray[j] = statarray[j+1];
                    statarray[j+1] = tempstat;
                    boo = 1;
                }
                j++;
            }
        }
        for(j = 0; j < c; j++)
        {
            printf("%s\t%ld\t%s\n", dp->d_name, statarray[j].st_size, ctime(&statarray[j].st_mtime));
        }   
    }

因此,每次运行此命令时,fprintf都会将j的值打印出来: 0 1 2 3 4 -12975991 ???????它从哪里得到那个号码? 显然我从数组索引超出范围

中得到了一个分段错误

任何想法?

3 个答案:

答案 0 :(得分:1)

您最有可能践踏记忆并覆盖j的内容。这个循环:

        while(j < c)
        {
            fprintf(stderr, "%d\n", j);  /*print debug info*/
            if(statarray[j].st_size < statarray[j+1].st_size)
            {
                tempstat = statarray[j];
                statarray[j] = statarray[j+1];
                statarray[j+1] = tempstat;
                boo = 1;
            }
            j++;
        }

请注意,它访问statarray[j+1],但statarray定义为

    struct stat statarray[c];

意味着在最后一次迭代中j+1 == c,它超出范围。在数组中写入该索引将会在堆栈中捕获其他内容,其中可能包括j,并解释为什么你会得到一个古怪的值。

有一些漂亮的工具可以让您更容易找到,例如valgrind

答案 1 :(得分:1)

在这个区块中,

        while(j < c)
        {
            fprintf(stderr, "%d\n", j);  /*print debug info*/
            if(statarray[j].st_size < statarray[j+1].st_size)
            {
                tempstat = statarray[j];
                statarray[j] = statarray[j+1];
                statarray[j+1] = tempstat;
                boo = 1;
            }
            j++;
        }

j等于c-1时,您正在访问未经授权的内存。那会搞砸了。在此之后,你无法预料到可预测的行为。

答案 2 :(得分:0)

j循环中有一个新变量while,永远不会设置外j