gpt4 book ai didi

c++指针在使用Visual Studio时分配比指定更多的空间

转载 作者:行者123 更新时间:2023-11-28 01:23:24 24 4
gpt4 key购买 nike

当我在 Visual Studio 中运行这段代码时,我在末尾得到了一堆垃圾字符,但是当我在在线编译器中运行它时,我得到了我想要的确切字符?(“olleH”)。请温柔点,我是菜鸟。

#include<iostream>
#include<string>

int main() {
std::string stringOne{ "Hello" };
int stringLength = stringOne.length();
char* stringTwo = new char[stringLength];
for (int i = 0; i < stringLength; ++i) {
*(stringTwo + i) = stringOne[stringLength - i - 1];
}

std::string stringThree = stringTwo;
std::cout << stringThree << std::endl;
}

最佳答案

这是您使用 char* stringTwo = new char[stringLength]; 得到的结果stringLength时的声明是五(就像这里一样):

 _____stringTwo_____
/ \
+---+---+---+---+---+------------------+
| ? | ? | ? | ? | ? | <arbitrary data> |
+---+---+---+---+---+------------------+

然后,您的循环将按如下方式填充它:

 _____stringTwo_____
/ \
+---+---+---+---+---+------------------+
| o | l | l | e | H | <arbitrary data> |
+---+---+---+---+---+------------------+

然后您将 is 视为 C 风格的字符串,尽管该字符串上没有空终止符。这意味着字符串函数将读取beyond 数据末尾并处理那里存在的任何内容。你应该做的是构建一个真正的 C 风格字符串、终止符和所有:

char *stringTwo = new char[stringLength+1];
for (int i = 0; i < stringLength; ++i)
*(stringTwo + i) = stringOne[stringLength - i - 1]; // or: stringTwo[i]
*(stringTwo + stringLength) = '\0'; // stringTwo[stringLength]

这会给你更正确的:

 _______stringTwo________
/ \
+---+---+---+---+---+----+-----------------+
| o | l | l | e | H | \0 |<arbitrary data> |
+---+---+---+---+---+----+-----------------+

当然,在 C++ 中使用 C 风格的字符串几乎是教科书中对坏主意的定义,只适用于非常罕见的情况。

除非你想成为一名 C+ 开发人员(那种奇怪的 C 开发人员,从未完全完全过渡到 C++),你应该拥抱 C++ 中发现的更现代的东西,< em>包括 std::string和来自 <algorithms> 的东西(如果您需要完成某件事而不是在教育环境中学习低级编程):

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

int main() {
std::string str("Hello");
std::reverse<std::string::iterator>(str.begin(), str.end());
std::cout << str << std::endl;
}

关于c++指针在使用Visual Studio时分配比指定更多的空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55113405/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com