所以我这个问题我无法修复:-( 在我的.h我有这个:
protected:
char* _textPath_1;
FileReader* _reader_3;
在.cpp中我已经:
_reader_3 = new FileReader();
_textPath_1 = "foo";
_reader_3->openFile(_textPath_1);
FileReader有这个:
private:
char* fileName;
public:
signed int openFile(char* name);
但如果我写这个(只是为了测试):
signed int FileReader::openFile(char* name) {
std::cout << name << std::endl;
fileName = name;
stream.open(fileName, std::ios::in);
if (!stream.is_open()) {
FileReader::printErrorOpeningFile(fileName);
stream.close();
return -1;
}
return 0;
}
fileName是一个char *,我需要它获得相同的名称值(foo)。我收到一个错误,我甚至无法打印名称,只是打印一个空行..为什么?
编辑:即使使用strcpy也不行。实际上在函数内部我无法打印名称的值,就像它已被“去初始化”答案 0 :(得分:1)
您需要为文本字符串_textPath_1
分配空间。
试试这个。
char myTextString[] = "foo";
_textPath_1 = myTextString;
这将创建一个本地字符数组(字符串),初始化为"foo\0"
。然后它将该字符串的地址复制到您的char指针_textPath_1
。作为 LOCAL 存储,它只在本地代码块中有效,并且在代码退出其范围后将无法使用。如果您需要该字符串超过本地代码块,则需要从堆内存中分配它(例如,使用new
)并记住在完成后将其解除分配。
您不能将strcpy
与未分配的指针一起使用,因为strcpy
期望目标char*
指向充当目标字符串缓冲区的字符数组。由于您根本没有分配任何字符空间,因此无法将"foo"
复制到_textPath_1
,这就是您尝试strcpy
时出现运行时错误的原因。
char*
的这些和其他乐趣是std::string
被发明的原因。不用担心分配和释放空间,不得不使用strcpy复制其值等等。考虑使用std::string _textPath_1
代替char* _textPath_1
。
答案 1 :(得分:0)
在调用函数之前,你必须分配_reader_3。
FileReader * _reader_3 = new FileReader;
我假设fileName是你的成员变量。在没有初始化的情况下访问指针将导致不可预测的结果
答案 2 :(得分:0)
如果你真的在头文件中定义全局变量:
char* _textPath_1;
FileReader* _reader_3;
然后你不应该这样做。全局变量应在头文件中声明,但在实现文件中定义。
此代码可以正常工作:
#include <iostream>
#include <fstream>
struct FileReader {
char* fileName;
std::fstream stream;
signed int FileReader::openFile(char* name) {
std::cout << name << std::endl;
fileName = name;
stream.open(fileName, std::ios::in);
if (!stream.is_open()) {
FileReader::printErrorOpeningFile(fileName);
stream.close();
return -1;
}
return 0;
}
void printErrorOpeningFile(char *) {}
};
int main() {
char* _textPath_1;
FileReader* _reader_3;
_reader_3 = new FileReader();
_textPath_1 = "foo";
_reader_3->openFile(_textPath_1);
delete _reader_3;
}