LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 720|回复: 1

大家帮我看看这段程序问题出在哪里

[复制链接]
发表于 2009-3-17 10:18:33 | 显示全部楼层 |阅读模式
/*
* =====================================================================================
*
*       Filename:  main.c
*
*    Description:  局部扭立方体的高容错路由算法
*
*        Version:  1.0
*        Created:  2009-3-5 12:43:14
*       Revision:  none
*       Compiler:  gcc
*
*         Author:  
*         Mail  :  
*        Company:  
*
* =====================================================================================
*/


#include <stdio.h>
#include <stdlib.h>
#include <time.h>


/*
* 定义点的结构体
* 每个点可以用一个十进制数来表示,转化成二进制数以后第n位的数字状态则表示
* 这个点处于n-1维局部扭立方体的时候所处于哪个立方体
*/
struct point
{
        /*
         * 定义一个变量用来存储一个点的相邻的所有的点是否有故障
         * 用一个n位的二进制数来表示,右起第m位则表示当这个点处于m-1维立方体中时,与它相对应的m-1维立方体的对应点的状态
         * 0表示有故障,1表示没有故障
         * 初始化的值均为无故障点
         */
        unsigned neighbours_status;
        /*
         * 标识这个点本身是否是故障点
         * 字符'0'代表有故障,'1'代表无故障
         */
        char trouble_status;
};

/*
* 用一个函数来确定局部扭立方体的维数
*/

unsigned get_demension(void)
{
        unsigned demension;
        printf("lease input the demension(unsigned) of the LFQ:");
        scanf("%u", &demension);

        return demension;
}


/*
* 初始化所有的顶点
*/
void init_points(unsigned demension, struct point *points)
{
        unsigned loop = 0;
        for(loop; loop < (1 << demension); loop++)
        {
                points[loop].trouble_status = '1';       
                points[loop].neighbours_status = (1 << demension) - 1;
                /*
                 * 初始化的同时打印出所有的点
                 */
                printf("points[%d].neighbours_status = %u ", loop, points[loop].neighbours_status);
                printf("points[%d].trouble_status = %c\n", loop, points[loop].trouble_status);
        }
}


/*
* start--end范围内的随机数产生函数
*/
unsigned random_produce(unsigned start, unsigned end)
{
        unsigned result;
        time_t seed_time;
        time(&seed_time);
        srand((unsigned) seed_time);
        result = rand() % (end - start + 1) + start;
        return result;
}



int main(int *argc, char **argv)
{

        struct point *points = NULL;
        unsigned demension = 0;                        /* 局部扭立方体的维数 */
        unsigned *trouble_points_tmp = NULL;        /* 用来标记临时的故障点的数组 */
        unsigned max_trouble_points = 0;         /* 故障点的最大数目 */       
        unsigned loop = 0;
        unsigned i = 0;

        /*
         * 获得局部扭立方体的维数
         */
        demension = get_demension();
        printf("demension is %u\n", demension);

        /*
         * 允许产生的最多故障点的个数
         */
        max_trouble_points = 2 * demension - 3;

        /*
         * 为顶点申请空间
         */
        points = (struct point *)malloc( (1 << demension - 1) * sizeof(struct point) );

        /*
         * 初始化顶点
         */
        init_points(demension, points);

        //测试随机函数
        i = random_produce(1, 10);
        printf("guzhangdiandgeshushi: %u\n", i);

        /*
         * 为最大故障点申请空间
         */
        printf("haha\n");
        if(max_trouble_points > 0)
         {
                trouble_points_tmp = (unsigned *)malloc(max_trouble_points * sizeof(unsigned));
                /*
                 * 初始化临时保存故障点的数组
                 */
                for (loop = 0; loop < max_trouble_points; loop++)
                {
                        trouble_points_tmp[loop] = 0;
                        printf("trouble_points_tmp[%u] is %u\n", loop, trouble_points_tmp[loop]);
                }
         }
        printf("hehe\n");
        /*
         * 这里有问题,初始化以后原来顶点里面的状态不知道为什么发生改变了
         * 跟踪了老半天没跟踪出是什么问题出来
         */
        printf("初始化故障空间后观察所有顶点:\n");
        for (i = 0; i < (1 << demension); i++)
        {
                printf("points[%u].neighbours_status is %u\n", i, points.neighbours_status);                       
        }
        printf("观察结束\n");



        //free(&points);
        //free(&trouble_points_tmp);
        return 0;
}
当有了/*
         * 为最大故障点申请空间
         */
        printf("haha\n");
        if(max_trouble_points > 0)
         {
                trouble_points_tmp = (unsigned *)malloc(max_trouble_points * sizeof(unsigned));
                /*
                 * 初始化临时保存故障点的数组
                 */
                for (loop = 0; loop < max_trouble_points; loop++)
                {
                        trouble_points_tmp[loop] = 0;
                        printf("trouble_points_tmp[%u] is %u\n", loop, trouble_points_tmp[loop]);
                }
         }
这段代码以后,原来的顶点里面的有几个顶点的neighbours_status值发生了改变,并且当我输入demension的值为0的时候,出现了Segmentation fault。调试了半天硬是没找出原因,麻烦大家帮我看一下
发表于 2009-3-17 13:42:56 | 显示全部楼层
unsigned max_trouble_points = 0; /* 故障点的最大数目 */
max_trouble_points = 2 * demension - 3; /* max_trouble_points 可能-3, -1,使得max_trouble_points 溢出为正数!! */

所以if (max_trouble_points > 0)是没有用的.
导致trouble_points_tmp分配不到内存
trouble_points_tmp[loop] = 0; 时产生段错误!

建议: long max_trouble_points = 0;
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表