[英]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);
str1
和str2
都str1
由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.