标题:C语言编程求助,酬金1000元RMB
只看楼主
long_23737
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2017-10-22
结帖率:0
已结贴  问题点数:20 回复次数:12 
C语言编程求助,酬金1000元RMB
     我的程序代码如下:                 
                        for(j=1;j<=10000;j++)
                        {
                                  if(head_se==NULL)                               /*将产生的二次电子添加到二次电子链表尾部*/
                               {
                                   head_se=(Particle*)malloc(sizeof(Particle));
                                   if(head_se==NULL)
                                   {
                                        printf("\nNot enough memory or allocate memory error happened.\n");
                                        exit (1);
                                   }
                                   tail_se=head_se;
                                   head_se->previous=NULL;
                               }                       
                               else
                               {
                                   tail_se->next=(Particle*)malloc(sizeof(Particle));
                                   if(tail_se->next==NULL)
                                   {
                                      printf("\nNot enough memory or allocate memory error happened.\n");
                                      exit (1);
                                   }
                                   tail_se->next->previous=tail_se;
                                   tail_se=tail_se->next;
                               }
/**********************************************************************/
/******更新电子速度-得到碰撞后的速度*********/
/**********************************************************************/

                               Rf1=ran1(p_idum);
                               Rf2=ran1(p_idum);
                    
                               tail_se->v.vr=fabs(v_extent*sqrt(Rf2*(2-Rf2))*sin(2*PI*Rf1))/V_N;
                               tail_se->v.vt=v_extent*sqrt(Rf2*(2-Rf2))*cos(2*PI*Rf1)/V_N;
                               tail_se->v.vz=v_extent*(1-Rf2)/V_N;

                               tail_se->mass=ME;
                               tail_se->charge=e_sim;
                               tail_se->p00=0;   /*权重系数需在下一循环重新计算*/
                               tail_se->p01=0;
                               tail_se->p10=0;
                               tail_se->p11=0;

                               tail_se->next=NULL;
                        }
              其中head_se和tail_se是指向我定义的结构体的指针变量。

上面是我的程序代码中的一段,9870步之前运行都正常,但是第9871个循环时,显示“Not enough memory or allocate memory error happened.”,即我上面程序中                                   

                                   tail_se->next=(Particle*)malloc(sizeof(Particle));
                                   if(tail_se->next==NULL)
                                   {
                                      printf("\nNot enough memory or allocate memory error happened.\n");
                                      exit (1);
                                   }
                                   给 tail_se->next分配内存失败
我的问题是:1.是什么导致 tail_se->next=(Particle*)malloc(sizeof(Particle))失败的?
            2.为什么前面9870个循环都每问题,9871步却出现这个问题?
哪位大神能够帮我解决这个问题,本人给酬金100人民币,可微信红包。请联系我:17739971880

[此贴子已经被作者于2017-10-23 21:36编辑过]

搜索更多相关主题的帖子: NULL malloc sizeof memory next 
2017-10-22 22:28
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:4 
看看 10000*sizeof(Particle) 是多少
2017-10-22 22:44
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
得分:4 
应该是申请的堆空间超过系统极限导致内存申请失败造成的。
要解决问题可能要具体看你的数据结构是怎样定义的,正常情况下累计申请1G内存应该问题不大。

能编个毛线衣吗?
2017-10-23 08:09
long_23737
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2017-10-22
得分:0 
回复 2楼 吹水佬
可是我的可用内存还有10G啊?不应该内存不够啊?
2017-10-23 20:37
wp231957
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:神界
等 级:版主
威 望:422
帖 子:13681
专家分:53296
注 册:2012-10-18
得分:4 
回复 4楼 long_23737
和物理内存没有关系

DO IT YOURSELF !
2017-10-23 20:43
long_23737
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2017-10-22
得分:0 
路过的大侠前辈们,能否帮忙看下我的程序,我最近博士毕业,但是程序这个问题总是解决不了,拜托了.

报酬好说,还希望江湖救急啊,感激不尽.

本人微信(电话) :17739971880
2017-10-23 21:06
long_23737
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2017-10-22
得分:0 
我的结构体定义如下:
  struct vectorv     /*定义速度结构体变量*/
   {
      double vz;      /* z向速度分量 */
      double vr;      /* r向速度分量 */
      double vt;      /* t向速度分量 */
   };
   
   
  typedef struct P     /* 带电粒子*/
   {
      double r;                     /*径向坐标 */
      double z;                      /*轴向坐标 */  
      int    tag;              
      struct vectorv v;              /* 速度 */
      double mass;                   /* 粒子质量 */
      double charge;                 /* 粒子电荷 */
      double p00;                     /* 4个网格点的权重系数*/
      double p11;
      double p01;
      double p10;
      struct P *next;         /* 指向链表中的下一个粒子 */
      struct P *previous;         /* 指向链表中的上一个粒子 */
   }Particle;

 extern Particle *head_e;
 extern Particle *head_se;
 extern Particle *head_xe1;
 extern Particle *tail_e;
 extern Particle *tail_se;
 extern Particle *tail_xe1;
2017-10-23 21:34
long_23737
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2017-10-22
得分:0 
回复 2楼 吹水佬
sizeof(Particle)是104个字节
2017-10-23 21:42
zbjzbj
Rank: 12Rank: 12Rank: 12
来 自:郑州
等 级:贵宾
威 望:52
帖 子:620
专家分:3020
注 册:2011-4-22
得分:4 
9870*104>1M,这可能是堆分配内存的界限。你的程序正常运行的话,最终需要多少步呢?
如果不讲实时性的话,可用其他的变量方式,比如预设一个表格来表示变量。
2017-10-23 23:17
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
以下是引用long_23737在2017-10-23 20:37:15的发言:

可是我的可用内存还有10G啊?不应该内存不够啊?

如果用32位编译,再加上堆区的内存碎片化问题,能用的就很有限。
在WIN32中,每个应用程序都可“看见”4GB的线性地址空间,
其中最开始的4MB和最后的2GB由操作系统保留,剩下不足2GB
的空间用于应用程序私有空间。具体分配如下:
0x00000000-0x00000FFF 为防止使用空指针的4,096字节
0x00001000-0x003FFFFF 为MS-DOS 和 WIN16应用程序
0x00400000-0x7FFFFFFF 为每个进程的WIN32专用地址
0x80000000-0xBFFFFFFF 的1GB用于共享的WIN32 DLL、存储器映射文件和共享存储区
0xC0000000-0xFFFFFFFF 的1GB用于VxD、存储器管理和文件系统
以上都是指逻辑地址,也就是虚拟内存。


[此贴子已经被作者于2017-10-24 00:18编辑过]

2017-10-24 00:16



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-481663-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.397163 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved