2014-12-13 8 views
1

내 프로그램이 컴파일되었지만 오류가 발생합니다 (세그먼테이션 오류). 실수는 무엇입니까?함수가 extern 변수를 수정합니다.

a.h

extern int k; 
extern int j; 
char funk(char *str[], int i); 

A.C

#include "a.h" 

int k=0; 
int j=0; 
char funk(char *str[], int i) { 
    if (str[k][j] == '\0' && k < i) { 
     k++; 
     j = 0; 
    } 

    return str[k][j++]; 
} 

b.c

#include <stdio.h> 
#include "a.h" 
int main(int argc, char *argv[]) 
{ 
    char c; 
    while (c = funk(argv, argc)) 
     printf("%c", c); 

    return 0; 
} 
+3

'a.h','a.c' 및'b.c'가 파일 이름입니까? 또한 stackoverflow 할 때'main()'함수를 잃어 버렸습니까? – Rizier123

+0
+0

안녕하세요 @hrlinc, 어떤 대답이 귀하의 질문을 해결했다면 체크 표시를 클릭하여 그것을 수락하는 것을 고려하십시오. 이는 해결책을 찾았으며 응답자와 자신에게 어느 정도의 평판을 제공한다는 것을 더 넓은 커뮤니티에 나타냅니다. – 2501

답변

1

당신은 아웃 오브 바운드 읽고있다. 루프에서 func()를 호출하면 k==i 여기에 이 표시되면 결국 경계를 읽을 수 있습니다. str[k][j] == '\0'

먼저 k < i을 확인하십시오.

+0

감사하지만 작동하지 않습니다! 펑크 프로그램에서 j = 0을 제거하면 작동합니다. argv [0]를 출력합니다. – hrlinc

1

이것은 argv[argc]null 포인터으로 보장되어 마지막 반복에서 역 참조하기 때문입니다.

N1570 (C11) 5.1.2.2.1/2 프로그램 시작에서

:

argv[argc]는 널 포인터이어야한다.

@ 2501의 대답에 따르면이 문제에 대한 가장 간단한 해결책은 && 피연산자의 순서를 바꾸는 것입니다.