0

这是我现在遇到的问题:

class Header{

   //something here

};

class Packet{

    public:

        Packet(Header* _header){
           header = _header;
        };

        char buf[1000];

        Header* header;
}

所以看起来就这么简单。当我创建一个标头(_header),然后将其用作创建数据包的参数时,调试器中的一切看起来都不错:数据包的指针标头确实指向之前创建的 _header。

现在,我开始加载 1000 个字符到 buf。对于前几百个字符,事情看起来仍然不错。但是当复制到 buf 的字符数变大(大约 800 个)时,数据包的指针头会突然被垃圾。不知道为什么。后来当我尝试访问创建的数据包的标头时,它是一个垃圾地址,程序崩溃了。

我尝试了 2 种加载 buf 的方法(通过strcpy并一一复制,如buf[i]=...),但仍然面临同样的问题。

可以帮助澄清或解决这个问题吗?谢谢

4

3 回答 3

2

这个问题意味着你写的东西buf超出了它的范围。确保你永远不会写超过第 1000 个索引,你会没事的。

于 2013-05-05T03:19:34.340 回答
2

您可以通过交换类中 header 和 buf 的定义来找出超出数组边界的问题。将其更改为

Header* header;
char buf[1000];

并且 buf 溢出到 header 不会是一个问题。您仍然需要找出缓冲区溢出的问题。

于 2013-05-05T03:22:57.690 回答
0

因为您正在传递 Header* _header,所以您存储在类 Packet 内的位置的数据不由该类管理。如果分配此内存的人发生了什么事,它将反映在 Packet 类中对它的引用中。初始化传递给 Packet 构造函数的值的代码在哪里?我想你的问题在那里。它在堆栈上吗?你叫新的吗?我敢打赌,这是您传递给构造函数的堆栈变量。

于 2013-05-05T03:27:43.473 回答