1

是的,我有这种问题,因为我总是很难遵循指针操作。所以,我有这个简单的代码:

struct myfile {
    char* name;
    char* content;
    long size;
};

myfile this_file;

int main() {
    read();
    return 0;
}

void read() {
    output("Please, specify file name: ");
    cin >> (this_file.name = new char);
    FILE *stream;
    stream = fopen(code.name, "r");
    if (stream != NULL) {
        fseek(stream , 0, SEEK_END);
        myfile.size = ftell(codefile);
        myfile.content = new char[myfile.size];
        fseek(myfile, 0, SEEK_SET);
        if ((fread(myfile.content, 1, myfile.size, stream)) == 0) {
            fclose(codefile);
            cout << "File is empty!\n");
        }
    }
 }

它正确地获取了文件的名称,它获取了内容的大小,但是当尝试为content成员分配空间时,程序崩溃了,我知道这是一些指针问题,但是像往常一样,不记得/弄清楚什么是吗。到达此行时崩溃:myfile.content = new char[myfile.size];

我再次需要你的帮助。谢谢!

4

3 回答 3

6

这导致缓冲区溢出:

cin >> (this_file.name = new char);

因为operator>>()它将消耗下一个空白字符的字符并写入this_file.name只有足够空间容纳单个字符的字符。

使用std::string(而不是char*)与std::getline()

std::string name;
if (std::getline(cin, name))
{
    // Use 'name'.
}

如果您正在调查指针,则需要分配一个数组char并防止读取超出分配的数组:

this_file.name = new char[32];
if (cin.getline(this_file.name, 32))
{
}

记住 todeletedelete[]什么是newor new[]

有一种替代方法可以std::string使用流将文件的内容读入。请参阅在 C++ 中将整个文件读入 std::string 的最佳方法是什么?.

于 2012-11-28T15:08:26.203 回答
3

要清楚这是告诉你指针问题,你不应该在任何生产代码中使用这样的指针,使用字符串或向量,这就是他们的用途!

这一行:- cin >> (this_file.name = new char); 是不是有点……奇怪

虽然这样做是合法的,但任何有经验的 c++ 编程都会对此感到惊讶。

另外,您只分配一个字符,足以存储终止空字符,但没有实际文本。

做这样的事情 -

this_file.name = new char[100];
cin >> this_file.name;

正如其他人所说,除了学习之外不要在现实生活中这样做,你必须猜测输入会有多大,如果用户发送更多它会破坏事情。您在浏览器中读到的所有那些安全漏洞等等?他们就是这样发生的!:)

这段代码似乎还有其他问题,例如创建一个名为 this_file 的变量,然后显然希望它在下一部分被称为“代码”,因此它需要更多地修复这个指针问题。

另外,请记住“delete[] this_file.name”在最后释放内存。如果您真的想在这里使用自己的内存分配,最好还是使用 std::unique_ptr 。

于 2012-11-28T15:17:39.963 回答
0

使用 std::string 代替 char* 和 std::ifstream 代替 FILE*,所有问题都将迎刃而解。

于 2012-11-28T15:08:06.650 回答