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

时间:2019-03-12 02:50:23

标签: c++

当我在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;
}

2 个答案:

答案 0 :(得分:3)

char* stringTwo = new char[stringLength];为5(如此处所示)时,使用stringLength语句可以得到以下内容:

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

然后,您的循环将按如下所示填充它:

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

然后将您视为C样式的字符串,尽管该字符串上没有空终止符。这意味着字符串函数将读取数据末尾的 并处理其中存在的所有内容。您应该做的是构造一个真正的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;
}

答案 1 :(得分:-1)

std:string is not null terminated string.
#include<iostream>
#include<string>

int main() {
    std::string stringOne{ "Hello" };
    int stringLength = stringOne.length();
    char* stringTwo = new char[stringLength+1]; // allocate one byte extra to store null character
    for (int i = 0; i < stringLength; ++i) {
        *(stringTwo + i) = stringOne[stringLength - i - 1];
    }
    *(stringTwo + stringLength) = '\0'; // add null character
    std::string stringThree = stringTwo;
    std::cout << stringThree << std::endl;
}