2017-03-19 1 views
0

나는 인사의 이름과 오늘 날짜의 날짜가 포함 된 구조체에 다음 코드를 실행하면 : 나는의 콘솔 출력을 얻을어떤 경우에이 메모리 위치가 손상되는 이유는 무엇입니까?

typedef struct savedSite{ 
    char *siteName; 
    char *date; 
} SAVED_SITE; 

void printSite(struct savedSite site){ 
    printf("Site: %s\nDate Added: %s\n",site.siteName,site.date); 
    FILE *fpointer; 
    fpointer = fopen("storage.txt","a"); 
    fprintf(fpointer,"Site: %s\nDate Added: %s\n",site.siteName,site.date); 
    fclose(fpointer); 
} 

SAVED_SITE* makeNewSite(){ 
    SAVED_SITE* returnSite = malloc(sizeof(SAVED_SITE)); 
    returnSite->siteName = malloc(sizeof(char)*50); 
    returnSite->date = malloc(sizeof(char)*25); 
    printf("Enter Site Name: "); 
    scanf("%20s", returnSite->siteName); 
    time_t t = time(NULL); 
    struct tm *tm = localtime(&t); 
    char s[64]; 
    strftime(s, sizeof(s), "%c", tm); 
    returnSite->date = s; 
    return returnSite; 
} 

int main() { 
    SAVED_SITE *newSite = makeNewSite();  
    printSite(*newSite); 
    free (newSite); 
    return 0; 
} 

:

Site: hello 
Date Added: Sat Mar 18 16:37:12 2017 

을하지만, 무언가의 파일 출력을

Site:n 
Date Added: 0í 

나는 w를 테스트 한 :이 (I 가정 어느 메모리, 문자는 문자로 읽고있는하지 뭔가 문제가 있음을 의미)처럼 hether 그것은 메모리 오버플로 때문입니다. 그러나 첫 번째 이후에 printf를 추가하면 fprintf와는 달리 예상대로 작동합니다. 왜 그런가요? 어떻게 파일에 콘솔에 무엇을 쓸 수 있습니까?

(나는 충분한 정보가 없기 때문에 취소 된 이전 질문에서이 질문을 수정했습니다.이 정보가 충분하지 않거나 비슷한 질문을 다시하는 것이 잘못된 연습 인 경우, 내가 프로그래밍 및 스택 오버 플로우에 비교적 새로운입니다. 알려주세요, 그래서 일반적으로 조언에 감사드립니다. 감사합니다!)

+1

'returnSite-> date = s;'->'strcpy (returnSite-> date, s); ' – BLUEPIXY

답변

3

makeNewSite()이 때의 기능을 존재하는 s 함수의 로컬 배열을하고, 중단 returnSite->date = s을한다 보고. 함수가 반환 된 후 date 멤버를 사용하면 정의되지 않은 동작이 발생합니다.

정의되지 않은 동작은 C 표준이 발생할 수있는 것에 대한 제한을 설정하지 않음을 의미합니다. 하나의 가능성이 작용하는 것 같습니다. 또 다른 가능성은 당신이 "기억 속에있는 문제"를 생각하게하는 방식으로 행동하는 것입니다. 또 다른 가능성은 당신이 보는 것처럼 시간이 지남에 따라 변화하는 증상들이 있다는 것입니다.

+0

고마워, 고쳐 줘! –