簡體   English   中英

使用C型鑄造的GCC警告

[英]GCC warning with c type casting

我試圖在新系統上編譯一個舊項目,但是在新系統上收到“從指針到不同大小整數的轉換”警告。

這是源代碼:

void mem_fill(char *myptr, char *mystr, uint32_t sz)
{           
    uint32_t len = strlen((const char*)mystr);
    if (len > sz) len = sz;
    memset(myptr, (int)NULL, sz); // <-- Warnning reported here
    memcpy(myptr, mystr, len);
}

NULL的定義如下:

#define NULL    (void *)0

舊系統不會報告此錯誤,它是RHEL4,gcc版本3.4.420050721。新系統是Cent OS 6.5,gcc版本4.4.7 20120313

我嘗試用“ long”替換強制類型“ int”,然后新系統將不再報告此錯誤,它看起來像新系統具有64位指針。 但是,如果我用long / char / short替換“ int”,則所有類型都可以通過舊系統上的build。

這是我的問題,為什么新系統不報告此鑄造警告而舊系統卻不報告? 源代碼是相同的,因此在開發環境中的某處是否隱藏了gcc的其他任何默認設置?

從好的角度來看,此功能等效於strncpy。 其實我的問題是-為什么我的舊系統為什么不報告此鑄造警告,而新系統卻報告,這是由不同版本的GCC引起的?

謝謝大家的幫助。

(int)NULL更改為0 該參數應該是填充內存的字節值,無論誰是第一次編寫該代碼的人都不了解空指針和零值字節之間的區別。

直接使用0代替(int)NULL

memset(myptr, 0, sz);

在舊系統中沒有警告,可能是因為NULL定義為:

#define NULL 0

NULL兩種定義在標准C中都是合法的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM