2016-08-10 2 views
-4

C를 배우기 위해 Harvard에서 EDx CS50 클래스를 사용하고 있는데 문제 세트 중 하나에서 코드의 이상한 동작을 발견했습니다 (이미 해결 된 솔루션을 생각해 냈지만 왜 원 본이 아닌지 이해하고 싶다). 할당의 아이디어는 jpeg 파일에 대한 참조가 삭제 된 파일을 검사하여 메모리에서 사진을 복구하는 것입니다.fopen이 C에서 변수 값을 변경합니다.

내가 가진 문제는 아래의 foundJPEG 부울입니다. 나의 독창적 인 아이디어는 첫 번째 사진이 발견 될 때까지 그리고 그 이후에 개별 파일을 작성하기 전까지는 false로 설정하는 것이었다. (그들은 연속적인 메모리 블록에 있어야했다.) 처음으로 jpeg 헤더가 발견되면 새 쓰기 파일이 생성되고 새 jpeg가 발견 될 때까지 정보가 복사됩니다. 또한 foundJPEG 변수는 true이됩니다. 원래 나는 if(foundJPEG) 코드 블록의 else 절에서만이 선언을했지만, 실행 한 후에는 fopen 함수가 호출 될 때마다 변수가 false으로 되돌아갔습니다. 따라서 변수가 이미 true로 변경된 경우에도 새 파일을 연 다음에 새로운 foundJPEG = true; 문을 추가했습니다.

제가 알고 싶은 것은 부울이 매번 fopen이 호출 될 때 거짓이되는 이유입니다. 특히, C가 메모리 할당에 대해 많은 통제권을 부여했기 때문에 파일을 열 때마다 또는 범위 문제로 인해 덮어 쓰여졌 기 때문에 그랬는지 궁금해하고있었습니다. 아마 이것은 신참 실수 일 것 같아요.하지만 더 큰 응용 프로그램을 작성할 때 누군가 실수를 더 잘 이해할 수 있도록 도와 줄 수있을 것 같았습니다. 고마워요!

/* 
* recover.c 
* 
* Computer Science 50 
* Problem Set 4 
* 
* Recovers JPEGs from a forensic image. 
*/ 

#include <stdio.h> 
#include <stdlib.h> 
#include <stdint.h> 
#include <stdbool.h> 

typedef uint8_t BYTE; 


int main(int argc, char* argv[]) { 
    int k = 0; 
    bool foundJPEG = false; 
    char title[7]; 
    FILE* file = fopen("card.raw", "rb"); 
    FILE* img; 

    BYTE buf[512]; 
    int size = sizeof(buf); 
    while(fread(&buf, size, 1, file) == 1) { 
     if(buf[0] == 0xff && buf[1] == 0xd8 && buf[2] == 0xff && buf[3] >= 0xe0 && buf[3] <= 0xef) { 
      if(foundJPEG) { 
       fclose(img); 
       k++; 
       sprintf(title, "%03d.jpg", k); 
       img = fopen(title, "wb"); 
       foundJPEG = true; 
      } 
      else { 
       sprintf(title, "%03d.jpg", k); 
       img = fopen(title, "wb"); 
       foundJPEG = true; 
      } 


     } 
     if(foundJPEG) { 
      fwrite(&buf, size, 1, img); 
     } 

    } 

    fclose(img); 
    return 0; 
} 
+0

문제를 한두 문장으로 압축 할 수 있습니까? 소설 읽기는 너무 재미 있지 않습니다. –

+1

img가 정의되지 않았을 때 fclose (img)를 처음 호출 할 때 정의되지 않은 동작이있을 수 있습니다. 게다가 if와 else foundJPEG 테스트에서 똑같은 코드 블록을 가지고 있습니다. –

+0

@self 죄송합니다. 처음으로 질문을 올렸습니다. 기본적으로, 나는 그 코드 블록에서 fopen 함수가 foundJPEG 부울 값을 변경하는 이유를 알고 싶습니다. – Sraffa

답변

1

적어도 두 가지 사례가 코드에 있습니다.

fclose(img); 

당신은 sprintf와 당신의 스택에 다른 뭔가를 덮어 쓰게됩니다 7 바이트 버퍼에 8 자 3 + 4 + null 종결을 작성합니다

char title[7];   
sprintf(title, "%03d.jpg", k); 

초기화되지 않은 IMG 이것을 요구하고있다.

문제가 원인 일 수 있습니다.

+0

고마워요! 당신 말이 맞아요, 제목 배열에 null 종결자를 잊어 버렸습니다.img에 대해서는 NULL을 초기화해야한다고 생각합니다. – Sraffa

관련 문제