2013-03-21 6 views
1

10 개의 스레드를 생성하고 정상적으로 실행하는 프로그램을 작성했습니다. 프로그램이 잘 실행되고 있지만 결국에는 세그먼트 오류가 발생합니다. 이 결함은 무엇이며, 그 원인은 무엇이며 어떻게 해결합니까? 내 코드는 다음과 같습니다프로그램 실행 중 세그먼트 오류

#include<stdio.h> 
#include<pthread.h> 
void *print(void *num); 

int main() 
{ 
    pthread_t tid[10]; 
    int n,check; 
    void *exitstatus; 
    for(n=1;n<=10;n++) 
    { 
     check=pthread_create(&tid[n],NULL,print,(void *)&n); 
     if(check=0) 
      printf("thread created"); 
     pthread_join(tid[n],&exitstatus); 
    } 

    return 0; 

} 

void *print(void *num) 
{ 
    int i,*val=(int *)num; 
    for(i=0;i<(5);i++) 
     printf("Hello World!!!(thread %d)\n",*val); 
} 
+0

gdb를 사용하여 오류의 원인을 찾아 냈습니까? – ziu

답변

8

당신은 많은 결함이 :이

0을보십시오이

for(n=0;n<10;n++) 

if(check=0) // No, this will assign 0 to check instead of compare it 

을 시도

for(n=1;n<=10;n++) // No, The array starts from 0 and lasts on 9 

+0

C 및 다른 C 언어의 배열이 0에서 시작하기 때문에 0에서 – user3032010

+0

@ kanika가 아니라 n을 1에서 초기화하면이 오류가 발생합니다. –

3

색인을 초과하는 배열에 액세스하고 있습니다. 정의되지 않은 동작입니다. 또한 check == 0 당신이 평등을 확인하는 방법입니다

for(n = 0; n < 10; n++) { 
//your stuff 
} 

- 인덱스 t[0]에서

배열 t[10]가 시작되고 t[9]에서 끝나야합니다. 프로그래밍 스타일에

#include<stdio.h> 
#include<pthread.h> 
void *print(void *num); 

int main() 
{ 
    pthread_t tid[10]; 
    int n,check; 
    void *exitstatus; 
    for(n = 0; n < 10; n++) 
    { 
     check=pthread_create(&tid[n], NULL, print, (void *)&n); 
     if(check == 0) 
      printf("thread created"); 
     pthread_join(tid[n], &exitstatus); 
    } 
    return 0; 
} 

void *print(void *num) 
{ 
    int i,*val=(int *)num; 
    for(i = 0; i < 5; i++) 
     printf("Hello World!!!(thread %d)\n", *val); 
} 

또 다른 중요한 참고 : check = 0 그래서 코드는 다음과 같이해야한다 0

check에 할당 할 적절한 들여 쓰기를 사용하여 공백을 현명하게 사용하십시오. 적절한 들여 쓰기와 공백을 사용하면 대부분의 프로그래밍 오류와 버그를 없앨 수 있습니다. 예를 들어 for 루프의 연산자 앞뒤에 공백 하나와 , 다음에 다음 매개 변수 앞에 함수를 호출하는 동안 매개 변수 사이에 공백 하나가 있습니다.

+0

설명 - SEGFAULT (세그멘테이션 오류)는 프로그램이 프로그램에 대해 유효하지 않습니다. 이 프로그램은 어레이의 끝을 지나서 접근하는 것이 그 완벽한 예입니다. C는이 방법이 좋지 않습니다. 배열의 마지막 이후에 유효한 메모리가 있다면,'& tid [n]'을 사용하여 결과를 유용한 메모리에 쓰면서 쓰레기를 만듭니다. – ash

관련 문제