2013-10-13 3 views
0
void append(Link *link,LList *list) 
{ 
Link *lastLink=NULL; 
lastLink=list->head; 
if(lastLink!=NULL) 
{ 
    while(lastLink->next!=NULL) 
    { 
     lastLink = lastLink->next; 
    } 
    lastLink->next=link; 
} 
else 
{ 
    list->head=link; 
} 
list->size++; 
} 

for(i=0;i<65000;i++) 
{ 
    link=(Link*)malloc(sizeof(Link)); 
    link->value=i; 
    append(link,list2); 
    printf("%d\n",list2->size); 
} 

위의 코드는 for 루프를 호출하는 연결된 목록에 대한 추가 기능입니다. 시스템 시계를 사용하여이 기능의 런타임을 테스트합니다. 자체적으로 실행될 때 충돌 이전에 루프의 8264 회 반복 만 통과하고 비슷한 루프 (65000 회 반복으로 다른 목록 작성)에서 앞에 추가 기능을 실행하면 추가 루프가 충돌하기 전에 508에 도달합니다. 그래서 그것은 메모리와 관련이 있지만 확실하지 않습니다.이 루프의 너무 많은 반복 만 통과 할 수 있습니까?

+0

'list2'가 올바르게 초기화 되었습니까?'list2'를 초기화하는 코드를 표시 할 수 있습니까? – Kninnug

+0

list2를 처리하는 코드의 나머지 부분을 보여주십시오. 그리고 그것이 충돌 할 때 정확히 무슨 일이 일어날까요? 세고 폴트? –

답변

0

"충돌"로 인해 segfaults라고 가정합니다.

우선, link->nextNULL으로 설정하지 않았습니다. link에 메모리를 할당 한 후 link->next에 가비지 값이 포함되어 있으면 목록의 끝을 찾을 수 없게됩니다.

또한 메모리를 할당하고 사용하지 않도록주의하십시오. 힙 메모리가 부족할 가능성이 큽니다.

for(i=0;i<65000;i++) 
{ 
    if ((link = malloc(sizeof(Link))) == NULL) { 
     /* Out of memory */ 
     fprintf(stderr, "Out of memory.\n"); 
     /* Handle error... */ 
    } 
    else { 
     link->value=i; 
     link->next = NULL; 
     append(link,list2); 
     printf("%d\n",list2->size); 
    } 
} 

내가 루프 본문에 link->next = NULL을 추가 :이 문제를 방지하려면 malloc에의 반환 값을 테스트해야합니다. 대신 append() 내부에서 할 수 있습니다. malloc에서 캐스트를 제거했습니다. 일반적으로 나쁜 습관이기 때문에. 이 작업을 시도해도 여전히 충돌이 발생하면 list2이 올바르게 초기화되었는지 확인하십시오.

0

메모리 공간이 부족할 수 있습니다. 이 경우 malloc은 메모리를 할당 할 수 없으며 an은 NULL을 반환합니다. 당신이 "링크"를 초기화하기 전에의 malloc의 리턴 값을 테스트 할 수 있습니다

if ((link = malloc(sizeof(Link))) == NULL) 
{ 
    /* Error Handling: Memory ran out of space */ 
} 
else 
{ 
    link->value=i; 
    append(link,list2); 
    printf("%d\n",list2->size); 
} 

또 다른 문제는 당신이! "lastLink-> 다음 = NULL"을 테스트하지만 다음-속성을 초기화하지 않을 것입니다. malloc으로 메모리를 할당하면 방금 공간이 생깁니다. 메모리 내용이 정의되지 않았습니다. 따라서 link-> next = NULL을 사용하여 다음 속성을 초기화해야합니다. 또 다른 가능성은 calloc입니다. calloc은 메모리와 malloc을 할당하지만 calloc은 0으로 메모리를 초기화합니다. calloc (1, sizeof (Link))를 사용할 수 있습니다. 메모리 공간이 충분하지 않으면 calloc은 NULL을 반환합니다.

관련 문제