#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <time.h>
using namespace std;
char * GetCurTimestring()
{
char w_content[64];
SYSTEMTIME Tm;
GetLocalTime(&Tm);
memset(w_content, 0, sizeof(w_content));
sprintf_s(w_content, "%04d/%02d/%02d %02d:%02d:%02d.%03d", Tm.wYear, Tm.wMonth,
Tm.wDay, Tm.wHour, Tm.wMinute, Tm.wSecond, Tm.wMilliseconds);
//char* strCurTime = w_content;
//char * T = new char[64];
//strcpy_s(T, 64,strCurTime);
//return T;
return w_content;
}
int main()
{
char *time = GetCurTimestring();
//下面代碼有亂碼
printf("%s\n",time);
Sleep(1000);
char * time2 = GetCurTimestring();
printf("%s\n", time2);
Sleep(1000);
char * time3 = GetCurTimestring();
printf("%s\n", time3);
getchar();
return 0;
}
vs編譯的,為什么只能顯示8個字符,其他的都是亂碼,呼叫的函式里改成注釋的之后就可以了
uj5u.com熱心網友回復:
char w_content[64]; 是堆疊上的記憶體, 注釋的部分是再堆上分配的記憶體,注意,你的記憶體沒釋放哦uj5u.com熱心網友回復:
static char w_content[64];uj5u.com熱心網友回復:
可以說一下原理么uj5u.com熱心網友回復:
釋放的話是釋放呼叫后的那個char*嗎,還是怎么釋放uj5u.com熱心網友回復:
加static讓w_content保存在全域資料區而非堆疊中。
uj5u.com熱心網友回復:
w_content是區域變數,回傳區域變數的操作是未定義的。區域變數的作用域是其所在的函式,從定義開始到函式呼叫結束而結束,這是其生命周期。因此,加static是改變其生命周期,讓其宣告周期變成程式結束而結束(從定義開始);用堆上的空間,理由是其空間有用戶(寫代碼的人)自己申請,自己決定什么時候釋放,即生命周期是靈活的,但是如果程式退出,堆上的空間會被系統回收,釋放。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/266043.html
標籤:C語言
下一篇:那個大佬給看一下,哪里不對了
