簡體   English   中英

無法理解C中asprintf()函數的參數之一

[英]Unable to understand one of the parameters of asprintf() function in C

我實際上是在修改一部分代碼以使其對我的目的有用,但是我無法獲得此語句的確切作用:

    asprintf(&buffr, "%.*s", packet_length, in + 8);

“%。* s”的具體含義是什么? 使用asprintf()函數安全嗎? 或者將snprintf()函數用於相同的目的會更好,更可靠?

提前致謝。

格式說明符"%.*s"用於從char*參數打印特定數量的字符(避免要求以null終止)。 在這種情況下, packet_length字符將從in + 8打印。

來自man asprintf()

函數asprintf()和vasprintf()與sprintf(3)和vsprintf(3) 類似不同之處在於它們分配的字符串足夠大以容納包含終止空字節的輸出 ,並通過第一個參數返回指向它的指針。 該指針應傳遞給free(3)以在不再需要時釋放分配的存儲。

從緩沖區溢出的角度來看,它是安全的,但它是非標准功能(從鏈接頁面開始,它是GNU擴展)。 在發布代碼的上下文中,在調用asprintf()之前已知道緩沖區的大小, asprintf()為程序員提供了一個便利,因為它避免了malloc() (這是避免猜測asprintf()必要條件malloc()要填充的緩沖區的最大大小)。

如果不要求可移植性,則snprintf()除了提供asprintf() ,什么都沒有提供,並且asprintf()更加易於使用。

由於這是標記為C ++的代碼,因此您可以使用 std::string代替:

 
 
 
  
  #include <string> std::string s(in + 8, packet_length);
 
  

如果確實需要,請使用 std::string::c_str() 這避免了必須手動 free()asprintf()生成的緩沖區的 asprintf()

暫無
暫無

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

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