簡體   English   中英

std :: copy行為和指針算法

[英]std::copy behavior and pointer arithmetic

我正在寫一些東西來序列化數據,因此我需要能夠寫到特定的內存位置,以便另一個進程能夠反序列化結果。

假設我有兩個單詞要序列化為兩個10字節的塊,每個塊應該看起來像這樣。

|---------------------|---------------------|
|         10          |          10         | 
|---------------------|---------------------|
|        word1        |         word2       |
|---------------------|---------------------|

這是我寫的一個例子。

#include <algorithm>
#include <string>
#include <iostream>

int main()
{
    const char *str1 = "abcd";
    const char *str2 = "efgh";
    char *buffer = new char[20];
    char *cursor = buffer;
    cursor = std::copy(str1, str1 + 10, cursor);
    cursor = std::copy(str2, str2 + 10, cursor);
    std::cout << std::string(buffer, buffer + 8) << std::endl;    
}

但是,我們可以看到結果是兩個單詞彼此相鄰。 顯然我需要做一些填充,但是為什么會這樣呢? 我的猜測是std :: copy會復制“ abcd”,然后繼續復制6個以上的字符,即使當時內存中有什么垃圾。

顯示的代碼中存在多個錯誤。

cursor = std::copy(str1, str1 + 10, cursor);
cursor = std::copy(str2, str2 + 10, cursor);

str1str2str1由4個字符加上尾隨的'\\0'字節組成的字符串文字。 這就是字符串文字。 每個五個字節。 因此,最后,以上代碼嘗試從五個有效字節中復制前十個字節。 兩次。 這是未定義的行為,超過兩次。

std::cout << std::string(buffer, buffer + 8) << std::endl;

這將構造一個std::string ,將其初始化為20字節緩沖區的前8個字節; 然后將其內容寫入std::cout 在這一點上,這已經是未定義的行為。 由此獲得的任何輸出都是完全沒有意義的,並且可以是任何東西。 否則,您的程序甚至可能在此之前崩潰。 這就是“未定義的行為”的意思。

為什么會這樣呢?

因為您將迭代器(指針)增加到數組的邊界之外,所以程序的行為是不確定的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM