C語言 《C專家程式設計》編譯器日期被破壞

2021-08-28 20:17:48 字數 842 閱讀 7562

char * localized_time(char * filename)

struct tm *tm_ptr;

struct stat stat_block;

char buffer[120];

stat(filename,&stat_block);

tm_ptr = localtime(&stat_block.st_mtime);

strftime(buffer,sizeof(buffer),"%a %b %e %t %y",tm_ptr);

return buffer;

問題就出在函式的最後一行,也就是返回buffer的那行。buffer是乙個自動分配記憶體的陣列,是該函式的區域性變數。當控制流 離開申明自動變數的範圍時,自動變數便自動失效。這就意味著即使返回乙個指向區域性變數的指標,當函式結束時,由於該變數已被銷毀,誰也不知道這個指標所指向的位址的內容是什麼。

在c語言中,自動變數在堆疊中分配記憶體。當包含自動變數的函式或**塊退出時,他們所占用的記憶體便被**,他們的內容肯定會被下乙個所呼叫的函式覆蓋。這一切取決於堆疊中先前自動變數位於何處,活動函式申明了什麼變數,寫入了什麼內容等。原先自動變數位址的內容可能被立即覆蓋,也可能稍後才被覆蓋。

解決這個問題有幾種方案:

1、返回乙個指向字串常亮的指標;

2、使用全域性申明的陣列;

3、使用靜態陣列;

4、顯示分配一些記憶體,儲存返回的值(注意記憶體的釋放)

5、呼叫者分配記憶體來儲存函式的返回值。為了提高安全性,呼叫者應該同時指定緩衝區的大小。

如果可以在同一**塊中同時進行「malloc」和「free」操作,記憶體管理是最為輕鬆的

C 語言 編譯器

c 語言是高階程式語言,人們在使用 c 語言工作的時候不必用數字碼表示指令,大大簡化了對於計算機底層暫存器的操作,人們可以把工作的重點放在 設計和具體功能的實現,編寫出更易讀易懂的 可是計算機的工作和人類正好相反,c 語言編寫的 對於計算機而言就好比是天書且沒有意義可言,因為計算機是識別機器語言的,...

C語言程式設計 蒐集C C 編譯器

在所有的和計算機的相關的專業中,c,c 幾乎都是必修課,而我們用的編譯器多半都是turboc 2.0,visual c borland c builder,然而c c 的編譯器是何其多,長期使用乙個編譯器會讓我們形成思維的定視,就像當我們長期使用了windows再轉換成使用unix會產生排斥一樣,所...

C語言的編譯器

c語言的常用編譯器 目前最流行的c語言編譯器有以下幾種 gnu compiler collection 或稱 gcc microsoft c 或稱 ms c borland turbo c 或稱 turbo c 這些c語言版本不僅實現了ansi c標準,而且在此基礎上各自作了一些擴充,使之更加方便 ...