[英]Does strcat_s() require the use of realloc()?
以示例代碼*為例:
char *string = (char*)malloc(sizeof(char));
strcat_s(string, strlen(string) + 10 + 1, "characters");
上面的代碼編譯並運行,讓我相信內存重新分配正在發生。 但是,當以更大的比例應用時(也遞歸地),我在隨機位置接收內存錯誤(每次運行程序時都不同)。
strcat_s()可以超越界限嗎? 因此需要realloc()來確保正確分配內存嗎?
注意:可能是錯誤是無關的,盡管它們在應用示例中的代碼后巧合地出現了。
*我最初只分配了一個字節的原因是,在上下文中我正在使用動態大小,因此string
的大小會改變,但是數量不明。
上面的代碼編譯並運行,讓我相信內存重新分配正在發生。
僅僅因為程序看起來像你期望的那樣並不意味着它是正確的,甚至從C的角度來看它的行為是完全定義的。
但是,當以更大的比例應用時(也遞歸地),我在隨機位置接收內存錯誤(每次運行程序時都不同)。
strcat_s()
可以超越界限嗎?
是。
因此需要
realloc()
來確保正確分配內存嗎?
沒有。
strcat_s()
和strcat()
都不執行任何重新分配。 他們沒有被指定這樣做,他們這樣做是不安全的。
您收到錯誤是因為您正在錯誤地使用該功能(即使您沒有收到錯誤)。 您有責任確保第二個參數不超過第一個參數所指向的數組的大小,但是您公然無視該責任。 我認為你只是對strcat_s()
應該做什么以及它的第二個參數意味着什么產生了嚴重的誤解。
strcat_s()
提供但strcat()
不是檢查指定的數組邊界是否因為第二個字符串長度超出可容納范圍而不會溢出。 這使您strcat_s()
在執行連接之前檢查第二個字符串的長度,這是有利的,因為strcat_s()
可以以非常低的成本自己完成,因為它必須掃描該字符串。 strcat_s()
沒有比任何其他C操作或函數更多的能力來獨立地確定第一個參數指向的數組的長度。 它依靠你來告訴它。
如果您需要適應數組大小的動態調整,那么這就是您的責任,跟蹤當前的分配大小也是如此。
在這里你只分配1個字符
char *string = (char*)malloc(sizeof(char));
所以string
可以容納的唯一字符串是""
(零長度字符串)
然后,您嘗試將字符串"characters"
附加到string
,該字符串不能包含除""
之外的字符串且未初始化。 此外, strlen(string)
的結果將不確定,因為再次未初始化string
。
strcat_s(string, strlen(string) + 10 + 1, "characters");
你可能想要這個:
char *string = (char*)malloc(sizeof(char) * 100); // allocate 100 bytes
strcpy(string, "Hello ");
strcat_s(string, 100, "characters");
printf("%s\n", string); // will display "Hello characters".
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.