2014-02-20 35 views
0

代碼:C或C++ sprintf和值在結構

sprintf(tmp, "xbitmap_width %d\n", symbol->scale); 

輸出:

xbitmap_width 1075052544 

預期輸出 - 規模的值,它是5所以它應該是:

xbitmap_width 5 

我失蹤了什麼?爲什麼sprintf需要指針值?

+0

嘗試在此行之前打印'symbol-> scale' –

+2

什麼類型是規模... –

+1

聽起來像規模是一個指針 – Hogan

回答

2

更新:
如果symbol->scale的確不是一個指針,那麼也保證了tmp足夠大,以避免溢出。我希望tmp至少 18個字符的大,但最好讓它足夠大(如30或更大),並且如果它在堆上分配:它初始化到零:memsetcalloc(30, sizeof *tmp)將是可取的。

您可能還想確保symbol不是由函數返回的堆棧值。這也是未定義的行爲。然而,鑑於你說你正在使用newmalloc(它不會初始化結構,順便說一句),這不成問題。
這裏的初始化位(當使用malloc時)可能是,但:malloc僅保留足夠的內存來存儲給定對象一次或多次。內存是初始化,但:

char *str = malloc(100); 

是一樣的東西,你給一羣猴子類型的作家的那件事:最終他們中的一個可能拉閘衝壓成一排莎士比亞:嗯,如果你malloc這樣的字符串,並打印它們,最終其中之一可能最終包含字符串「不要恐慌」。現在
,這是不準確真正,但你明白了吧...
要確保你的結構被初始化,要麼使用callocmemset是STR給你悲傷的成員。

如果你的結構是這樣的:

struct symbol 
{ 
    int *scale; 
} 

然後你逝去價值scalesprintf。這個值是一個內存地址,而不是一個int。一個int,你可能不會保證至少有2個字節的大小(最常見的是4)。一個指針的大小爲4或8個字節,因此傳遞一個指針,並且sprintf將其解釋爲int,您會得到未定義的行爲。

要在您的情況下打印5

struct symbol *symbol = malloc(sizeof *symbol); 
int s = 5; 
symbol->scale = &s; 
printf("%d\n", *(symbol->scale));//dereference the scale pointer 

但是,這是不確定的行爲:

printf("%d\n", symbol->scale);//passing pointer VALUE ==> memory address 
//for completeness & good practices' sake: 
free(symbol); 

哦,並且在評論中指出:snprintfsprintf什麼strncpystrcpystrncatstrcat:使用允許指定最大字符數的功能更安全

+0

nb - 因爲操作順序符號 - >縮放工作 – Hogan

+0

@Hogan:我知道,我傾向於過度使用括號......在業餘時間將它歸咎於我的計劃,但我發現它有助於可讀性:P –