LinuxSir.cn,穿越时空的Linuxsir!

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

Segmentation fault.是什么问题?

[复制链接]
发表于 2003-6-4 23:46:30 | 显示全部楼层 |阅读模式
今天写了一个模拟页面淘汰的FIFO程序.好像已经执行完成了.但不知道为什么在后面多了一个Segmentation fault.

  1. #include <unistd.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #define AMOUNT 10
  5. struct PAGE{
  6. int No;
  7. int DATA;
  8. };
  9. void FIFO(int k,int m,struct PAGE Vmemory[],struct PAGE memory[],int *shortage);
  10. void first(int k,struct PAGE Vmemory[],struct PAGE memory[]);
  11. void randarray(int a[],int k);
  12. main()
  13. {
  14. struct PAGE memory[3],Vmemory[AMOUNT];
  15. int k=AMOUNT,shortage3=3,aVmemory[AMOUNT];
  16. int shortage4=4,shortage5=5,shortage6=6,shortage7=7,shortage8=8;
  17. int i,j;
  18. randarray(aVmemory,k);
  19. for(i=0;i<k;i++)
  20. Vmemory[i].No=aVmemory[i];
  21. for(i=0;i<k;i++)
  22. printf("%5d",Vmemory[i].No);
  23. printf("\n");
  24. first(3,Vmemory,memory);
  25. FIFO(3,AMOUNT,Vmemory,memory,&shortage3);
  26. printf("shortage3=%d\n",shortage3);
  27. first(4,Vmemory,memory);
  28. FIFO(4,AMOUNT,Vmemory,memory,&shortage4);
  29. printf("shortage4=%d\n",shortage4);
  30. first(5,Vmemory,memory);
  31. FIFO(5,AMOUNT,Vmemory,memory,&shortage5);
  32. printf("shortage5=%d\n",shortage5);
  33. first(6,Vmemory,memory);
  34. FIFO(6,AMOUNT,Vmemory,memory,&shortage6);
  35. printf("shortage6=%d\n",shortage6);
  36. first(7,Vmemory,memory);
  37. FIFO(7,AMOUNT,Vmemory,memory,&shortage7);
  38. printf("shortage7=%d\n",shortage7);
  39. first(8,Vmemory,memory);
  40. FIFO(8,AMOUNT,Vmemory,memory,&shortage8);
  41. printf("shortage8=%d\n",shortage8);
  42. }

  43. void randarray(int a[],int k)
  44. {
  45. int i,s=0;
  46. srand(getpid());
  47. s=(float)319.0*(rand()%32767)/32767.0+1.0;
  48. for(i=0;i<k;i+=4)
  49.         {
  50.         a[i]=s+512;
  51.         a[i+1]=a[i]+513;
  52.         a[i+2]=(float)a[i]*(rand()%32767)/32767.0+512;
  53.         a[i+3]=a[i+2]+1;
  54.         s=(float)(rand()%32767)*(318.0-a[i+2])/32767.0+a[i+2]+2.0+512;
  55.         }
  56. }
  57. void FIFO(int k,int m,struct PAGE Vmemory[],struct PAGE memory[],int *shortage)
  58. {
  59. int i,j,poiter=0;
  60. struct PAGE temp;
  61. for(j=k;j<m;j++)
  62.         {
  63.         for(i=0;i<k;i++)
  64.                 if(Vmemory[j].No==memory[i].No)  break; /*If the page is found,l
  65. eave the circle*/
  66.         if(i==k)  /*If the page is not found,enchange the pages*/
  67.                 {
  68.                 temp=memory[poiter];
  69.                 memory[poiter]=Vmemory[j];
  70.                 Vmemory[j]=memory[poiter];
  71.                 poiter+=1;*shortage+=1;
  72.                 if(poiter==k)  poiter=0;
  73.                 }
  74.         }
  75. }
  76. void first(int k,struct PAGE a[],struct PAGE b[])
  77. {
  78. int i;
  79. for(i=0;i<k;i++)
  80.         b[i]=a[i];
  81. }
复制代码

运行的结果是:
shortage3=10
shortage4=10
shortage5=10
shortage6=10
shortage7=10
shortage8=10
Segmentation fault
我就是不明白.最终的运行结果都正确地出现了.却还是多了个可能是堆栈错误.
用GDB调试也能够执行到最后,但同样提示:
Program received signal SIGSEGV, Segmentation fault.
0x400272b8 in ?? ()
而且我只打印
shortage3=10
shortage4=10
shortage5=10
则没有提示错误.
发表于 2003-6-5 02:05:08 | 显示全部楼层
一般是内存访问越界,写了空指针或者野指针之类的。
发表于 2003-6-5 08:26:21 | 显示全部楼层
看看自己的指针是不是指到非法地址
 楼主| 发表于 2003-6-5 11:03:58 | 显示全部楼层
这个我在网上也查到了。但我实在是查不出来。毕竟已经运行出结果了。可能是数组有问题。如果你们是正在用linux的话,能不能帮我运行看?我的服务器GCC版本太低。GDB也不好。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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