簡體   English   中英

C的可變參數功能

[英]variadic function in C

1)為什么/* test1 */塊下的代碼不能打印出什么,但是/* test2 */下的代碼/* test2 */正確打印?

2)如何在/* test 1 */代碼塊中使用va_arg(va, char*)


void rdfDBG(int dbglevel, const char *fmt, ...) {

    va_list va;

#if 1 /* test 1 */
    char* logbuf;

    if ((logbuf = calloc(0x0, LOGBUFFERSIZE))== NULL)
        fprintf(stderr, "out of memory\n"); /* 1. Is there a better way instead of using fprintf? */

    va_start(va, fmt);
    (void) vsnprintf(logbuf, strlen(logbuf), fmt, va); /* 2. print nothing */
    va_end(va);

    free(logbuf);
#endif

#if 0 /* test 2 */
    va_start(va, fmt);
    vprintf(fmt, va); /* 2. print "pinfile pings6.txt" */
    va_end(va);
#endif


}


int ptInitialize(){

    char* pinfile;
    pinfile = "pings6.txt";

    rdfDBG(kINFO, "pinfile %s\n", pinfile);

    return 0;
}

/* test 1 */下的代碼不會打印任何內容,因為vsnprint()函數不會打印到stdout。 它只是將其輸出寫入提供的緩沖區。

但是,如果代碼沒有崩潰,那真是倒霉,因為該行:

if ((logbuf = calloc(0x0, LOGBUFFERSIZE))== NULL)

實際上告訴calloc()分配0字節的內存。 因此,我認為也不保證logbuf指向的內存也為零-因此,不僅緩沖區的字節長為零,而且在其上調用strlen()可能會崩潰或產生無效的結果。

另外, vsnprint()的第二個參數應該是緩沖區的大小,即您為logbuf分配的大小,而不是緩沖區中已經存在的任何字符串的長度。 這是為了限制寫入緩沖區的字節數,以避免緩沖區溢出。

因此,要使一切正常運行,您需要進行以下更改:

    if ((logbuf = calloc(0x0, LOGBUFFERSIZE))== NULL)

..至..

    if ((logbuf = calloc(1, LOGBUFFERSIZE))== NULL)

..為1個LOGBUFFERSIZE字節分配空間。 並更改:

(void) vsnprintf(logbuf, strlen(logbuf), fmt, va);

..至..

vsnprintf(logbuf, LOGBUFFERSIZE, fmt, va);

..傳遞緩沖區的大小,並刪除無用的(void) 並添加一行以打印logbuf ,例如:

fputs(logbuf, stderr);

之后。

這個:

vsnprintf(logbuf, strlen(logbuf)...

永遠不會格式化任何東西,因為logbuf全為零(由calloc分配,因此strlen將返回零,這使得vsnprintf永遠不會格式化任何東西,因為您告訴它最多打印零個字符。

暫無
暫無

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

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