输入的n太大,如111111111,但是没有溢出,为什么不能执行到printf(“1”);

void Build(DuLinkList *L,int n)//环的建立
{
int i;
DuLinkList p,q;
*L = (DuLinkList)malloc(sizeof(DuLNode));
(*L)->number = 1;
srand((int)time(NULL));
(*L)->key = rand()%10+1;
if(n<=0){
printf("\t\t不能创建joseph环,请重新输入指令\n");
}
else if(n==1){
(*L)->next = (*L)->prior= (*L);
}
else{
p = *L;
for(i = 2;i<=n;i++){
q = (DuLinkList)malloc(sizeof(DuLNode));
q->number = i;//进行编号
q->key = rand()%10+1;//产生随机正整数密码
p->next = q;
q->prior = p;
p = q;
}
printf("1\n");
q->next = *L;
(*L)->prior = q;
}
//free(q);为什么不能释放q
}

首先,确定无疑的是,你这块代码是可以执行到printf("1\n");这个地方的。
其次,执行到这个地方对内存也有一定的要求的,理论上最少占用内存是111111111*16/1024/1024/1024G的内存。
执行完之后,查看实际占用了有1.9G内存之多。
你的系统要能保证提供到1.9G内存且这个时候运行依然很顺畅。
最后那个free(q)的地方,只是free当前一个节点(最后一个节点),其它节点的free要依次通过next去free,
且置NULL,防止循环回来,多次free同一段内存。

下面附代码:

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

typedef struct _DULNODE
{
        int number;
        int key;
        struct _DULNODE *prior;
        struct _DULNODE *next;
} DuLNode, *DuLinkList;

void Build(DuLinkList *L,int n)//环的建立
{
        int i;
        DuLinkList p,q;
        *L = (DuLinkList)malloc(sizeof(DuLNode));
        (*L)->number = 1;
        srand((int)time(NULL));
        (*L)->key = rand()%10+1;
        if(n<=0)
        {   
                printf("\t\t不能创建joseph环,请重新输入指令\n");
        }   
        else if(n==1)
        {   
                (*L)->next = (*L)->prior= (*L);
        }   
        else
        {   
                p = *L; 
                for(i = 2;i<=n;i++)
                {
                        q = (DuLinkList)malloc(sizeof(DuLNode));
                        q->number = i;//进行编号
                        q->key = rand()%10+1;//产生随机正整数密码
                        p->next = q;
                        q->prior = p;
                        p = q;
                }
                printf("1\n");
                q->next = *L;
                (*L)->prior = q;
        }
        //free(q);为什么不能释放q
}

int main()
{
        DuLinkList t;
        Build(&t, 111111111);

        pause();

        return 0;
}