内存的重新分配

 

#define __STDC_WANT_LIB_EXTl__ 1
#include <stdio.h>
#include <stdlib.h>
typedef enum {false=0,true=1}bool;
unsigned long long *pPrimes =NULL;
unsigned long long limit =0LL;

bool found =false;
int count=0;
int i;

size_t capacity =10;
#define CAP_INCR 9

unsigned long long trial;
unsigned long long *pTemp;
//把定义都他妈放前面,省的报错,赋值可以以后在弄,定义一定要现在!!!


int main(void)
{
    
    printf("Enter the upper limit for primes.............");
    scanf_s("%LLU",&limit);
    //输入unsigned是一种很长的数据类型%llu是他的形式。这里LLU大小写无所谓。
    

    pPrimes=calloc(capacity,sizeof(unsigned long long ));

    //pPrimes是一个指针,calloc初始化分配内存.数量为capacity,每个大小为sizeof(...)
    
    if(!pPrimes)
    {
        printf("Not enough ,memory....");
        
        return 1;
    }
    
    //检验分配的内存空不空,如果pPrimes==0  那么!(pPrimes)=true 

    *pPrimes=2ULL;
    *(pPrimes + 1)=3ULL;
    *(pPrimes +2 )=5ULL;
    //pPrimes 就是启始地址 pPrimes+1表示下一个元素地址

    count = 3;
    trial=*(pPrimes +2)+2ULL;//就是7ULL

    pTemp=NULL;
    
    while (trial<=limit)
    {
        for (i=1;i<count;i++)//遍历之前质数
        {
            if(!(found=(trial%*(pPrimes+i))))//如果发现可以整除某个之前的质数.也就是这个数不是我们要的质数。
                break;
        }
    
    
        if (found)//与上面相反,是质数
        {
            if(count==capacity)//capacity是我们给的上限,只有10个,假如count到达10个后,内存就不够用了,这时候重新分配内存
            {
                capacity += CAP_INCR;//再来9个单位的空间!

                pTemp=realloc(pPrimes,capacity*sizeof(unsigned long long ));//重新分配

                if(!pTemp)//检验分配是否成功
                {
                    printf("Unfortunately memory reallocation failed.\n");
                    free(pPrimes);
                    pPrimes=NULL;
                    return 2;        
                }
            
                pPrimes=pTemp;//还给他
            
            }
                *(pPrimes+count++)=trial;//把这个数储存到pPrimes分配的内存里,并且是下一个空间
        
        }
                trial +=2ULL;//进入下一个奇数
    }
    
    
    
    printf("%d primes found up to %llu \n",count,limit);

    for (i=0;i<count;++i)
    {
        printf("%12lld",*(pPrimes + i));
        if(!(i+1)%5)
            printf("\n");
    
    }//五个一行的打印
    
    printf("\n");

    free(pPrimes);
    pPrimes=NULL;

    system("pause");
    return 0;
    
    
    
    
    
    
    
    
    
    
}

 

posted @ 2016-06-13 16:00  V5八旗  阅读(235)  评论(0编辑  收藏  举报