LinuxSir.cn,穿越时空的Linuxsir!

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

求助 这个段错误是怎么回事?

[复制链接]
发表于 2006-5-15 20:20:00 | 显示全部楼层 |阅读模式
下边这个程序, 只要输入第一个数是360, 就出现段错误, 其他值没有发现问题, 哪位高手能帮我看看这段代码有什么错误? (运行环境:cygwin)
输入:
360 36
0 0

代码:

#include <stdio.h>
#include <math.h>

#define MAX 100

int * CommDivisor(int num, int * s, int len){
        int i, j;
        int div;
        *s = 0;
        for(i = 1, j = 0; i <= len && j <= len; i++){
                if(num % i == 0 && (div = num / i) <= MAX){
                        if(i != div && i != 1){
                                *(s + (++j)) = i;
                                *(s + (++j)) = div;
                        }
                }
        }
        *s = j;
        *(s + (++j)) = '\0';
        return s;
}

int main(int argc, char *argv[])
{
        int g, l;
        int sqrt_g, sqrt_l;
        int len_g, len_l;
        int *s_g, *s_l, *s_c;
        int i, j;
        int commdiv = 0;
        int sqrt_c, len_c;

        while(1){
                g = l = 0;
                scanf("%d", &g);
                scanf("%d", &l);
                if(g == 0 && l == 0) break;
                                if(g < MAX && l < MAX) {
                                        printf("%d\n", g);
                                }
                                else{
                                        sqrt_g = sqrt(g);
                                        s_g = (int *)malloc(sqrt_g * sizeof(int));
                                        s_g = CommDivisor(g, s_g, sqrt_g);

                                        sqrt_l = sqrt(l);
                                        s_l = (int *)malloc(sqrt_l * sizeof(int));
                                        s_l = CommDivisor(l, s_l, sqrt_l);

                                        len_g = *s_g;
                                        len_l = *s_l;

                                        if(len_g > 2 || len_l > 2){
                                                printf("%d\n", g);
                                        }
                                        else{
                        for(i = 1; i <= len_g && commdiv == 0; i++){
                                for(j = 1; j <= len_l; j++){
                                        if(*(s_g + i) == *(s_l + j)){
                                                commdiv = *(s_g + i);
                                                break;
                                        }
                                }
                                                }
                        if(commdiv > 0){
                                                        sqrt_c = sqrt(commdiv);
                                                        s_c = (int *)malloc(sqrt_c * sizeof(int));
                                                        s_c = CommDivisor(commdiv, s_c, sqrt_c);
                                                        len_c = *s_c;
                                                        if(len_c >= 2) printf("%d\n", g);
                                                        else printf("%d\n", l);
                                                        free(s_c);
                                                }
                                        }
                                        free(s_g);/*就这一句出现段错误*/
                                        free(s_l);
                                }
        }
        return 0;
}
发表于 2006-5-16 10:11:35 | 显示全部楼层
没有注释 看不懂啊
再是代码

  1. #include <stdio.h>
  2. #include <math.h>

  3. #define MAX 100

  4. int * CommDivisor(int num, int * s, int len)
  5. {
  6.   int i, j;
  7.   int div;
  8.   *s = 0;
  9.                   for(i = 1, j = 0; i <= len && j <= len; i++)
  10.                   {
  11.                     if(num % i == 0 && (div = num / i) <= MAX)
  12.                     {
  13.                                           if(i != div && i != 1)
  14.                                           {
  15.                                             *(s + (++j)) = i;
  16.                                             *(s + (++j)) = div;
  17.                                                 }
  18.                                 }                                
  19.                 }
  20.                 *s = j;                                                                               
  21.                 *(s + (++j)) = '\0';                                                                               
  22.                 return s;                                                                               
  23. }

  24. int main(int argc, char *argv[])
  25. {
  26.                 int g, l;
  27.                 int sqrt_g, sqrt_l;
  28.                 int len_g, len_l;
  29.                 int *s_g, *s_l, *s_c;
  30.                 int i, j;
  31.                 int commdiv = 0;
  32.                 int sqrt_c, len_c;
  33.                
  34.                 while(1){
  35.                                 g = l = 0;
  36.                                 scanf("%d", &g);
  37.                                 scanf("%d", &l);
  38.                                 if(g == 0 && l == 0)
  39.                                                 break;
  40.                                 if(g < MAX && l < MAX)
  41.                                 {
  42.                                                 printf("%d\n", g);
  43.                                 }
  44.                                 else
  45.                                 {
  46.                                                 sqrt_g = sqrt(g);
  47.                                                 s_g = (int *)malloc(sqrt_g * sizeof(int));
  48.                                                 s_g = CommDivisor(g, s_g, sqrt_g);
  49.                                                
  50.                                                 sqrt_l = sqrt(l);
  51.                                                 s_l = (int *)malloc(sqrt_l * sizeof(int));
  52.                                                 s_l = CommDivisor(l, s_l, sqrt_l);
  53.                                                
  54.                                                 len_g = *s_g;
  55.                                                 len_l = *s_l;
  56.                
  57.                                                 if(len_g > 2 || len_l > 2){
  58.                                                                 printf("%d\n", g);
  59.                                                 }
  60.                                                 else
  61.                                                 {
  62.                                                         for(i = 1; i <= len_g && commdiv == 0; i++){
  63.                                                                 for(j = 1; j <= len_l; j++){
  64.                                                                         if(*(s_g + i) == *(s_l + j)){
  65.                                                                                         commdiv = *(s_g + i);
  66.                                                                                         break;
  67.                                                                                 }
  68.                                                                 }
  69.                                                         }
  70.                                                         if(commdiv > 0){
  71.                                                         sqrt_c = sqrt(commdiv);
  72.                                                         s_c = (int *)malloc(sqrt_c * sizeof(int));
  73.                                                         s_c = CommDivisor(commdiv, s_c, sqrt_c);
  74.                                                         len_c = *s_c;
  75.                                                         if(len_c >= 2) printf("%d\n", g);
  76.                                                         else printf("%d\n", l);
  77.                                                         free(s_c);
  78.                                                         }
  79.                                                 }
  80.                                         free(s_g);/*就这一句出现段错误*/
  81.                                         free(s_l);
  82.                                 }
  83.                 }
  84.                 return 0;
  85. }
复制代码
回复 支持 反对

使用道具 举报

发表于 2006-5-16 10:13:34 | 显示全部楼层
我的UE不好用  代码也难看
但是不能像你那样的
提问题  但同时也要节约别人的时间
注释
代码 规范
很重要。。。。
回复 支持 反对

使用道具 举报

发表于 2006-5-16 10:15:59 | 显示全部楼层
我的UE不好用  代码也难看
但是不能像你那样的
提问题  但同时也要节约别人的时间
注释
代码 规范
很重要。。。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-5-16 13:57:05 | 显示全部楼层
我已经找到了问题所在了, 是因为我分配的内存的长度不够,

请问楼上那位, 代码是怎么让他按格式显示的?
回复 支持 反对

使用道具 举报

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

本版积分规则

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