2016-06-25 2 views
0

언어는 C입니다. char * types (char * array []/char ** array) 배열을 함수 인수로 사용하고 있습니다.이 두 줄을 모두 별도의 줄에 인쇄하려고합니다.인쇄가 성공적으로 끝난 후 printf가 충돌합니다.

while (*array) { 

     printf("%s\n", *array); 
     printf("after last print"); 
     array++; 
    } 

지금 어떤 이유로, 특정 입력으로, 그것은 마지막 * 배열이 인쇄 된 후 충돌 즉시 모든 값을 인쇄 관리하지만. 따라서 마지막 printf 이후에는 "마지막 인쇄 후"더 이상 인쇄하지 않습니다. 불행히도, 나는 netbeans C 지원, gdb없이 Windows 7에있어. netbeans에 설치하려고 할 때 몇 가지 문제가 있었지만 또 다른 이야기입니다.

우선 무엇이 원인 일 수 있습니까? 둘째, 어떻게 gdb없이이 동작을 디버깅하려고 할 수 있습니까? 문제를 디버깅하는 데 도움이되는 대답을 제공하고이를 해결하는 방법을 제시한다면, 그 점만으로도 점수를 부여 할 것입니다. 충돌을 일으키는 함수 인수와 관련된 몇 가지 배경 정보 : 필자는 strtok을 사용하여 char * 문자열에서 char ** arr을 생성했습니다. 여기서 공간은 delimeter로 사용되었습니다.

편집 :

일부 자세한 내용은 : 그 같은 함수 내 마지막 * 배열의 printf하려고하면 잘 작동하고, 프로그램이 정상적으로 계속. 그럼이 작품은 :

printf("%s\n", array[4]); 

마지막 인덱스가 내 테스트 케이스에 4 일이 발생합니다. 그러나 이전과 같이 루프 내에서 동일한 작업이 수행되면 printf가 처리되지만 두 번째 줄을 더 이상 인쇄하지 않으면 바로 충돌합니다.

+0

마지막 배열 요소가'NULL' 포인터로 설정되지 않았을 가능성이 큽니다. 'array [n] = NULL;'과 같은 것이 필요할 것입니다. 여기서'n'은 문자열의 수입니다. 물론 '배열'은 'n + 1'요소를위한 공간이 필요합니다. –

답변

2

당신이 명시 적으로 문자열 배열의 마지막 요소가 null로 초기화하지 않으면이 초기화되지 않은 (즉 야생 포인터)가 될 것, 그래서 당신은 그것을 역 참조 printf에 충돌 때.

것이다 것 :

  1. 명시 적으로 루프가 실제로 끝에서 중지하는 알 수 있도록 NULL로 당신의 문자열 배열의 마지막 요소를 초기화합니다.
  2. 포인터를 증가시키는 대신 루프 카운터 변수로 역 참조하는 오프셋을 증가시킵니다.

이 코드는 나를 위해 잘 작동하고 충돌하지 않습니다

#include <stdio.h> 
char *array[] = { "Hello", "World", "My", "Name", "Is", "Govind", "Parmar", NULL } ; 

int main() 
{ 
    int i; 
    for(i = 0; *(array+i); i++) 
    { 
     printf("%s\n", *(array+i)); 
    } 
    printf("after last print\n"); 
    return 0; 
} 
+0

나는 테스트를 거쳤으며 마지막은 NULL이며, 여전히 마지막 * 배열을 printf로 관리 한 직후에는 충돌하지만, 마지막 '마지막 인쇄 후'는 더 이상 인쇄하지 않는다. –

+0

@ VilleMiekk-oja 내 편집 된 답변보기 –

+0

코드를 사용하여 프로그램을 마지막 인쇄 후 충돌 전의 상태로 가져올 수있었습니다. 나중에 메모리가없는 기능에 충돌이 발생합니다. 왜 내가 내 버전의 코드에서 printf를 사용하지 않았는지 이해할 수 없다. 심지어 함수 뒤에 오는 코드가 분명히 충돌한다. 하지만 코드가 어떻게 든 그것을 했으므로 올바른 답을 줄 것입니다. –

0

내가이 기능의 사용 후 오는 코드를 댓글을 달았습니다. 그 결과 코드가 성공적으로 실행되었습니다. 코드의 실행 순서는 줄 바꿈 (line after line) 방식으로 선형 적이 지 않았습니다. 그러나 마지막 * 배열 인쇄 후에는 함수 뒤에 오는 코드를 실행하려고했습니다. 이제 코드를 주석 처리하면 기능이 매력처럼 작동합니다.

관심있는 사람들은 * 배열에서 메모리를 해제하는 것과 관련된 코드를 주석 처리했습니다.