標籤:har pre ide mes spl 處理 [] va_list 大於
C語言中,對 sizeof() 的處理都是在編譯階段進行。
#include<Windows.h>#include<stdio.h>int MessageBoxPrint(char *szFormat, ...);int fun(char ch[]);int WinMain(HINSTANCE hInst, HINSTANCE tmp, LPSTR strCmd, int nShow){ char str[1024]; MessageBoxPrint("%p", hInst); MessageBoxPrint("ch=%d", fun(str)); return 0;}int MessageBoxPrint(char *szFormat, ...){ char buf[1024]; va_list va; va_start(va, szFormat); vsnprintf(buf, sizeof(buf), szFormat, va); va_end(va); return MessageBox(NULL,buf,"printf",MB_OK);}int fun(char ch[]){ return sizeof(ch);}
View Code
sizeof在fun函數種計算的是指標ch的長度,32位OS下恒為4
sizeof計算字串含要看在什麼位置,寫完代碼時很難預估風險,最好使用strlen
修改如下
#include<Windows.h>#include<stdio.h>int MessageBoxPrint(char *szFormat, ...);int fun(char ch[]);int WinMain(HINSTANCE hInst, HINSTANCE tmp, LPSTR strCmd, int nShow){ char str[1024]; MessageBoxPrint("%p", hInst); MessageBoxPrint("ch=%d", fun(str)); return 0;}int MessageBoxPrint(char *szFormat, ...){ char buf[1024]; va_list va; va_start(va, szFormat); vsnprintf(buf, sizeof(buf), szFormat, va); va_end(va); return MessageBox(NULL,buf,"printf",MB_OK);}int fun(char ch[]){ return strlen(ch);}
View Code
這時還有個問題,由於WinMain裡面str沒有初始化,strlen計算長度的時候,長度是未知的。因為他要一直找到\0在完事,所以strlen的時候長度可能大於1024,可能等於1024,也可能小於1024。
02 WIndows編程——危險的sizeof