這是情況:
我們從使用 sprintf 的外部資源(如 strcat)收到了代碼。像這樣:
char buffer[1024];
sprintf(buffer, "Some text.");
sprintf(buffer, "%s%s", buffer, "Some more text");
sprintf(buffer, "%s%s", buffer, "again more text");
現在,這看起來很奇怪。我們都同意這看起來很奇怪。這不是我要問的。大家都知道應該用strcat,而且比較直接。除了看起來很奇怪之外,我正在詢問這可能導致的潛在問題。我們在 RHEL6 上運行,并使用 gcc 4.9.3。
謝謝你的幫助。
uj5u.com熱心網友回復:
該函式宣告如下
int sprintf(char * restrict s, const char * restrict format, ...);
注意型別限定符restrict。
根據C標準(7.21.6.6 sprintf函式)
2 sprintf 函式等效于 fprintf,不同之處在于輸出寫入陣列(由引數 s 指定)而不是流。在寫入的字符末尾寫入一個空字符;它不計為回傳值的一部分。 如果復制發生在重疊的物件之間,則行為是 undefined。
所以這些電話
sprintf(buffer, "%s%s", buffer, "Some more text");
sprintf(buffer, "%s%s", buffer, "again more text");
呼叫未定義的行為。
相反,呼叫可以這樣寫
char buffer[1024];
int offset = 0;
offset = sprintf( buffer offset, "Some text.");
offset = sprintf( buffer offset, "%s", "Some more text");
sprintf( buffer offset, "%s", "again more text");
或者
char buffer[1024];
char *p = buffer;
p = sprintf( p, "Some text.");
p = sprintf( p, "%s", "Some more text");
sprintf( p, "%s", "again more text");
至于限定詞restrict,一般來說是指(6.7.3 型別限定詞)
8 通過限制限定指標訪問的物件與該指標具有特殊關聯。這種關聯,在下面的 6.7.3.1 中定義,要求對該物件的所有訪問直接或間接使用該特定指標的值
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/330028.html
