2017-03-19 50 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 

但一些文件輸出像這樣(我假設意味着在內存中,這裏的東西是不是一個char被解讀爲一個字符一個問題):

Site:n 
Date Added: 0í 

我已經測試W¯¯不管它是因爲內存溢出,但是當我在第一個printf後面添加更多的printf時,它們的行爲與預期不同,與fprintf不同。爲什麼是這樣的,我怎樣才能在文件中寫入控制檯中的內容?

(我固定從以前的一個被取消,因爲我沒有足夠的信息這個問題。如果一個人沒有足夠的信息,或者如果它是錯誤的做法,重新提出了類似的問題,讓我知道,我是相當新的編程和堆棧溢出,所以一般建議表示讚賞。謝謝!)

+1

'returnSite->日期= S;' - >'的strcpy(returnSite->日期,S);' – BLUEPIXY

回答

3

makeNewSite()確實returnSite->date = s其中s是一個數組,它是局部的功能,並且不再存在的功能時,回報。在函數返回後date成員的任何使用給予未定義的行爲。

未定義行爲意味着C標準不設置上會發生什麼限制。一種可能性似乎有效。另一種可能性是表現的方式,讓你覺得「內存問題」。另一種可能性是,你得到的症狀隨時間而變化,因爲你所看到的。

+0

謝謝,固定它! –

相關問題