将char *传递给函数c ++

时间:2012-07-27 16:33:18

标签: c++ function char

所以我这个问题我无法修复:-( 在我的.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也不行。实际上在函数内部我无法打印名称的值,就像它已被“去初始化”

3 个答案:

答案 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;
}