[英]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.