0

我编写了一个程序,它有一个应该从命令行参数复制字符串的类。

这是有问题的代码。

void FileHandler::SetFile(const char*& filename)
{
    for(unsigned tsr = 0; tsr < 200; tsr ++){
        if(filename[tsr] == 0x0){
            mFilename = new char[tsr];
            strcpy(mFilename, filename);
            mFilenameAllocated = true;
        }
    }
}

我假设一个命令参数是 NULL 终止的,所以这个代码块会查找一个 NULL 字符来查找字符串的长度,然后再将它的 memcpy'ing 到一些新的内存空间中。

我忽略了什么?或者这段代码应该“正常工作”吗?

谢谢

编辑:

strcpy 有错吗?如果命令 arg 不是 NULL 终止的,它是否会沿着一段内存运行,直到导致访问冲突?

4

2 回答 2

3

您分配的字符串太短了一个字符。

想象一下输入是"A". 然后您将找到0x0at 索引 1,并分配一个字符。strcpy然后将复制 A 和空终​​止符,你注定要失败。

于 2013-02-05T21:45:35.007 回答
0

问题1:

找到 NULL 字符后,for 循环不会“中断”。这意味着有时它会表现出未定义的行为。(这在编码时间过长时会出现问题。)

问题2:

内存分配是 1 个字符短两个。

编辑:

贡献者已+1。

于 2013-02-05T21:52:13.070 回答