gpt4 book ai didi

c++ - C strings vs const char* 让我感到困惑......请帮忙

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:38:19 25 4
gpt4 key购买 nike

我是一名 C/C++ 初学者,试图构建一个看似非常简单的程序:它将文件加载到 C 字符串 (const char*) 中。然而,尽管该程序非常简单,但它并没有按照我理解的方式工作。看一看:

#include <iostream>
#include <fstream>

std::string loadStringFromFile(const char* file)
{
std::ifstream shader_file(file, std::ifstream::in);
std::string str((std::istreambuf_iterator<char>(shader_file)), std::istreambuf_iterator<char>());
return str;
}

const char* loadCStringFromFile(const char* file)
{
std::ifstream shader_file(file, std::ifstream::in);
std::string str((std::istreambuf_iterator<char>(shader_file)), std::istreambuf_iterator<char>());
return str.c_str();
}

int main()
{
std::string hello = loadStringFromFile("hello.txt");
std::cout << "hello: " << hello.c_str() << std::endl;

const char* hello2 = loadCStringFromFile("hello.txt");
std::cout << "hello2: " << hello2 << std::endl;

hello2 = hello.c_str();
std::cout << "hello2 = hello.c_str(), hello2: " << hello2 << std::endl;

return 0;
}

输出看起来像这样:

hello: Heeeeyyyyyy

hello2: 青!
hello2 = hello, hello2: Heeeeyyyyyy

初始的 hello2 值每次都会改变,总是一些随机的汉字(我使用的是日文电脑,所以我猜这就是它是汉字的​​原因)。

在我看来,这两个值似乎应该打印相同。一个函数返回一个 c++ 字符串,然后我将其转换为 c 字符串,另一个函数加载该字符串,从中转换 c 字符串并返回它。我通过在返回之前计算值来确保字符串在 loadCStringFromFile 中正确加载,这确实是我所想的,例如:

/*(inside loadCStringFromFile)*/
const char* result = str.c_str();
std::cout << result << std::endl;//prints out "Heeeyyyyyy" as expected
return result;

那么为什么值要改变呢?感谢您的帮助...

最佳答案

你的问题是 loadCStringFromFile 中的 str 是一个局部变量,当函数返回时被销毁。此时 c_str() 的返回值无效。

更多细节 here

您的第一个函数 loadStringFromFile 是一种更类似于 C++ 的执行方式,并说明了让类为您管理内存的好处。如果您使用 char*,那么您必须更加注意分配和释放内存的位置。

关于c++ - C strings vs const char* 让我感到困惑......请帮忙,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11815606/

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