[英]SDL_CreateTextureFromSurface crashes after using strcpy, strcat, sprintf, etc. in C
[英]strcpy and sprintf in C
我試圖設置一些這樣的字符串變量:
char thingA[7], thingB[7], thingC[7];
strcpy(thingA, "StringA");
strcpy(thingB, "StringB");
strcpy(thingC, "StringC");
printf("%s\n", thingA);
printf("%s\n", thingB);
printf("%s\n", thingC);
但是不要像這樣輸出:
StringA
StringB
StringC
它輸出如下:
StringA StringB StringC
StringB StringC
StringC
我已經嘗試過sprintf
,但得到相同的結果。 老實說,我不知道發生了什么或如何解決此問題,而且我在網上也找不到任何東西,因為出於某種原因,搜索這類東西已被證明很困難。 那么,基本上為什么將字符串b和c存儲在a中,而將c存儲在b中呢?
常見錯誤:您的聲明短了一個字節。 如果計算常量字符串中的字符,則為7,並且您需要空格來終止'\\0'
,否則將覆蓋內存並獲得未定義的行為。
因此,將它們聲明為[8]
,它將起作用。
該代碼的問題是,您在C中的字符串以null終止( \\0
),因此StringA
盡管具有7個可打印字符,但實際上需要8個字符來存儲。 這三個char數組在堆棧上背靠背,因此覆蓋終止null字符將導致它們被串聯。 指向char數組的每個指針均以不同的偏移量開頭,因此, thingB
和thingC
字符串較短,但是在所有情況下, printf
都會讀取該字符串,直到在thingC的末尾找到空字符為止。
請注意,這是一個經典的緩沖區溢出錯誤,您很幸運在thingC之后的堆棧上有一個空值,否則printf可以繼續讀取和打印內存的時間更長。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.