sprintf(tmp, "xbitmap_width %d\n", symbol->scale);
輸出:
xbitmap_width 1075052544
預期輸出 - 規模的值,它是5所以它應該是:
xbitmap_width 5
我失蹤了什麼?爲什麼sprintf
需要指針值?
sprintf(tmp, "xbitmap_width %d\n", symbol->scale);
輸出:
xbitmap_width 1075052544
預期輸出 - 規模的值,它是5所以它應該是:
xbitmap_width 5
我失蹤了什麼?爲什麼sprintf
需要指針值?
更新:
如果symbol->scale
的確不是一個指針,那麼也保證了tmp
足夠大,以避免溢出。我希望tmp
是至少 18個字符的大,但最好讓它足夠大(如30或更大),並且如果它在堆上分配:它初始化到零:memset
或calloc(30, sizeof *tmp)
將是可取的。
您可能還想確保symbol
不是由函數返回的堆棧值。這也是未定義的行爲。然而,鑑於你說你正在使用new
或malloc
(它不會初始化結構,順便說一句),這不成問題。
這裏的初始化位(當使用malloc
時)可能是,但:malloc
僅保留足夠的內存來存儲給定對象一次或多次。內存是不初始化,但:
char *str = malloc(100);
是一樣的東西,你給一羣猴子類型的作家的那件事:最終他們中的一個可能拉閘衝壓成一排莎士比亞:嗯,如果你malloc
這樣的字符串,並打印它們,最終其中之一可能最終包含字符串「不要恐慌」。現在
,這是不準確真正,但你明白了吧...
要確保你的結構被初始化,要麼使用calloc
或memset
是STR給你悲傷的成員。
如果你的結構是這樣的:
struct symbol
{
int *scale;
}
然後你逝去價值scale
到sprintf
。這個值是一個內存地址,而不是一個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);
哦,並且在評論中指出:snprintf
是sprintf
什麼strncpy
是strcpy
和strncat
爲strcat
:使用允許指定最大字符數的功能更安全
nb - 因爲操作順序符號 - >縮放工作 – Hogan
@Hogan:我知道,我傾向於過度使用括號......在業餘時間將它歸咎於我的計劃,但我發現它有助於可讀性:P –
嘗試在此行之前打印'symbol-> scale' –
什麼類型是規模... –
聽起來像規模是一個指針 – Hogan