02 WIndows編程——危險的sizeof

來源:互聯網
上載者:User

標籤: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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.