嘗試將兩個字符串鏈接在一起時緩衝區溢出,為什麼會出現此錯誤?

加布里埃爾·布爾扎奇尼

(在 C 中,使用 Visual Studio 2022 預覽版),我必須做一個將兩個字符串鏈接在一起的程序。這是我所做的:

  1. 我寫了兩個 for 循環來計算第一個字符串和第二個字符串的字符,

  2. 我檢查了(在鏈接函數內部,如果指針為空(第一個和第二個)。如果它們為空,則“返回 NULL”。

  3. 我創建了“char *result”。這是一個新字符串,這是要返回的字符串。我分配了足夠的內存來存儲 nprime、nsecond 和另外 1 個字符(零終止符)。我使用了malloc。

  4. 然後,我檢查了結果是否為空。如果它為空,則“返回 NULL”。

  5. 然後,我編寫了 2 個 for 循環來執行第一個字符串和第二個字符串之間的鏈接。在這裡我收到了一個編譯器警告(因為我認為它是在編譯時而不是在調試時)。緩衝區溢出,可寫大小為“nprime+nsecond+1”,但可能會寫入 2 個字節。我的理論是程序試圖在結果數組之外寫入,所以可能會丟失數據,我試圖編輯我的代碼,因此我寫了“nprime+nsecond+2”,但它不起作用,它不斷向我顯示相同的緩衝區溢出錯誤。

    #include <stdlib.h> 
    
    char* link( const char* first, const char* second) {
    size_t nprime = 0; 
    size_t nsecond = 0; 
    
    if (first == NULL) {
        return NULL; 
    }
    if (second == NULL) {
        return NULL; 
    }
    for (size_t i = 0; first[i] < '\0'; i++) {
        nprime++; 
    }
    for (size_t i = 0; second[i] < '\0'; i++) {
        nsecond++; 
    }
    char* result = malloc(nprime + nsecond + 1); 
    if (result == NULL) {
        return NULL; 
    }
    
    for (size_t i = 0; i < nprime; i++) {
        result[i] = first[i]; 
    }
    for (size_t i = 0; i < nsecond; i++) {
        result[nprime + i] = second[i]; 
    }
    result[nprime + nsecond] = 0; 
    
    return result; 
    }
    

這是主要的:

int main(void) {
char s1[] = "this is a general string  "; 
char s2[] = "this is a general test."; 
char* s; 
    
s = link(s1, s2); 
return 0; 
}
帕斯誇萊

警告是由於您在前 2 個 for 循環中定義的錯誤條件而發出的。正確的循環應該如下:

for (size_t i = 0; first[i] != '\0'; i++) {
    nprime++; 
}
for (size_t i = 0; second[i] != '\0'; i++) {
    nsecond++; 
}

根據您定義的條件(即first[i] < '\0'),您只是在計算給定字符串中有多少字符的 ASCII 代碼低於 的 ASCII 代碼,\0一旦發現不滿足此類條件的字符就退出循環。

由於'\0'ASCII 值為 0,因此您的 nprime 和 nsecond 永遠不會增加,從而導致 malloc 沒有足夠的空間容納您實際需要的字符。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

嘗試將兩個數組指針傳遞給隨機交換它們的函數時出現分段錯誤

為什麼在嘗試進行貨幣計算時會收到不正確的輸入字符串錯誤?C#

為什麼在嘗試顯示兩個狀態值的平均值時會得到 NaN?

拆分一個字符串並以相反的順序將其重新連接在一起

為什麼在嘗試保存貓鼬模型時會出現錯誤?

為什麼我在嘗試使用 reddit API 時會收到 405 錯誤?

為什麼在嘗試使用 JpaRepository 中的 save() 方法插入新記錄時出現“位於或接近“用戶”的語法錯誤”錯誤?

嘗試將 http 請求鏈接在一起並將最終輸出作為可觀察對象返回

為什麼我在嘗試使用 fin2.seekg(-2 * sizeof(int), ios::cur) 從末尾到中間讀取文件時出現奇怪的錯誤;? 沒有字符串

在 Django 中,為什麼會出現錯誤“/字符串索引處的類型錯誤必須是整數”?

為什麼我在嘗試實現 Hibernate 多對多映射時遇到此錯誤?

為什麼在嘗試將 Carbon 轉換為 DateTime 時會出錯?

為什麼在嘗試使用數組創建 Scoreboard 對象時出現錯誤?

為什麼在 Julia 中嘗試使用 ggplot 時會出錯?

誰能告訴我為什麼在嘗試調用此函數時會出錯?

為什麼使用向量存儲向量時會出現分段錯誤?

嘗試將 gif 圖像寫入緩衝區時出錯

為什麼在嘗試編譯時會收到未定義的引用錯誤?

為什麼在開發模式下嘗試 dffml 出現錯誤?

當我嘗試在 Invoice 表上添加外鍵時,為什麼會出現此錯誤?

為什麼每次嘗試安裝kivy時vscode都會出錯

為什麼總是出現這個錯誤,我試圖在函數運行時將一個角色隱藏起來

為什麼會出現self not defined的錯誤?

嘗試將 ImageView 轉換為字符串時出錯

為什麼這個 impl trait 會出現 `cannot return without recursing` 錯誤?

為什麼用換行符放置字符串?我正在嘗試將這三個輸入作為一行上的字符串

為什麼在嘗試安裝 mongoDB 時會出現此錯誤?

為什麼在使用字符串作為輸入時出現“Bash(輸入):找不到命令”錯誤,但是當我將代碼的那部分更改為整數時,它可以工作?

為什麼在嘗試將頂點添加到鄰接列表時遇到分段錯誤?