- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
所以,operator[]
没有直接说s[s.size()]
必须是s[s.size()-1]
之后的字符在内存中。它的措辞似乎是为了避免做出这种说法。
但是s.data()
指出s.data()+k == &s[k]
, 和 s.data()
必须返回一个指针。
忽略使用 &
的看似标准的缺陷在 CharT
以上而不是std::addressof
, 是否可以自由返回不同的 CharT
(比如,一个在 protected 页面上,或在 ROM 中)对于 s[s.size()]
在第一次调用 s.data()
之前? (很明显,它可以将缓冲区安排在一个只读页面上,上面有一个零;我说的是另一种情况)
明确地说:
据我所知,如果s.data()
永远不会被调用(编译器可以证明),那么 s[s.size()]
不需要与缓冲区的其余部分连续。
可以std::addressof(s[s.size()])
在调用 s.data()
后更改并且实现符合标准(只要 s.data()+k == &s[k]
在 .data()
之前评估了 []
,但编译器可以自由执行)。或者是否存在我看不到的不变性要求?
最佳答案
自 C++11 起,要求 std::string 存储在连续的内存中。这是 C++11 标准(第 24.4.1.4 节)中的引述:
The char-like objects in a basic_string object shall be stored contiguously. That is, for any basic_string object s , the identity &*(s.begin() + n) == &*s.begin() + n shall hold for all values of n such that 0 <= n < s.size() .
有关 operator[] 的返回值的引述表明它返回与 &*(s.begin()+n)
相同的值(第 21.4.5.1 节):
*(begin() + pos) if pos < size() . Otherwise, returns a reference to an object of type charT with value charT() , where modifying the object leads to undefined behavior
然后我们在(第 24.4.7.1 节)中对 data() 的返回值引用了这段话:
A pointer p such that p + i == &operator[](i) for each i in [0,size()] .
所以返回的数据与使用 &operator[] 得到的一样。使用 & 运算符检索的任何值都应连续存储。所以你可以得出结论,两者都返回一个指向连续内存的指针。所以它不会返回指向距离页面的指针。
请注意,这仅适用于 C++11。 C++11 之前的标准没有做出此类保证。
关于c++ - `std::basic_string::operator[]` 能否返回一个 "distant"保护页 nul 终止符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34163580/
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 7 年前。 Improve t
我有一个 const char* 指向十六进制格式的数据,我需要找到我正在检查的数据的长度 NUL-terminator 但是当\x00 出现时它检测到它作为 NUL 终止符返回不正确的长度。 我该如
如果 nul 永远不能成为 Windows 中的一个文件,那么如果使用对 nul 没有相同规则的操作系统在所有目录中创建一个名为“nul”的文件会怎么样。例如,如果在 CMD 中执行“echo 123
我知道 strlen() 不计算 NUL 终止字符。我真的知道这是事实。因此,这个问题并不是要问为什么 strlen() 可能“大概”不返回正确的字符串长度,这个问题已经在 StackOverfl
虽然 CStr 通常用于 FFI,但我正在读取 &[u8],它以 NUL 结尾并确保是有效的 UTF-8,所以没有需要检查。 但是 NUL 终止符不一定在切片的末尾。将此作为 &str 获取的好方法是
虽然 CStr 通常用于 FFI,但我正在读取 &[u8],它以 NUL 结尾并确保是有效的 UTF-8,所以没有需要检查。 但是 NUL 终止符不一定在切片的末尾。将此作为 &str 获取的好方法是
我正在使用 Java BufferedWriter 逐行写入文件。问题是,当我写完文件时,它在整个文件中显示“nul”。 我不认为问题出在我正在写的内容上,因为我用System.out.print仔细
我正在使用 R 使用 fread 读取一个文件,该文件包含许多列和行。该文件如下所示: 1_17118 1_18353 1_21882 1_21955 1_22054 Ind0001 -1
c89 海合会 (海湾合作委员会) 4.6.3 你好, 我在 *search = '\0' 上得到一个堆栈转储;我认为可以用 nul 终止一个字符串。 char *ptr_name = "hello@
这个问题在这里已经有了答案: NUL undeclared- first use in this function (4 个答案) 关闭 8 年前。 char word[5]={"fayed"};
我曾经使用以下函数写入很多不同的文件 using (FileStream fs = new FileStream(Settings.PsLog, FileMode.Truncate, System.S
我正在编写一个下载器,它将 url 拆分为多个部分并使用线程下载,可能我不会使用“join”,因为 join = 无法流式传输(如果所有线程未完成,则无法写入文件) 但是问题是 f.seek 和 wr
这是我服务器端的方法: void send_err(int socket_fd, char *msg) { /// To send an error message (`ERR`).
我需要创建一个将标准错误流重定向到某个文件的新进程。创建子进程的代码没有可用的控制台,因此在某些情况下 GetStdHandle(any) 将返回 0。子进程将出于某种原因尝试复制其所有标准 IO 句
我的 Notepad++ 中有这样的字符 当我尝试复制整行时,我实际上正在复制所有内容,直到“NUL”: File:1 我想做的就是替换那些空的,什么都没有,这样我就可以复制我的整行。也许有任何关键字
我正在通过 Java 中的 UDP 接收带有字节数组的数据包。我知道最大可能的字节大小,但我不知道当前接收的大小。 如果我从这个字节数组创建一个 String 实例,那么该字符串在有用的有效负载之后将
来自 the web我知道 C 包含 NUL 关键字。 编译时出现错误 NUL undeclared first use in this function' 我的代码片段: for (;;) {
#include #include int main() { char x[] = "Happy birthday to You"; char y[25]; char z[
我看到了here如果它不是 NULL 终止的,则不可能使用 strlen 找出 (unsigned char *) 字符串长度,因为 strlen 函数将遍历字符串但不会找到任何 '\0',因此运行-
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我是一名优秀的程序员,十分优秀!