以下代码中出现错误。写入_buf
时,Visual Studio会引发访问冲突错误。我该如何解决?
Sendn
函数是一个套接字发送函数。没问题,您可以忽略它。
似乎_buf
指向0x00000000
我看到的错误消息是
0xC0000005: 0x00000000 : access violation
void ?????::?????(int number, string title)
{
int titlesize = sizeof(title);
int bufsize = 4 + 4 + 4 + titlesize;
char *_buf = new char[bufsize];
_buf = { 0 };
// char _buf[bufsize] = { 0 }; (수정 내용)
int commands = 3;
int index = 0;
memcpy(_buf, &commands, sizeof(int));
index += sizeof(int);
memcpy(_buf + index, &number, sizeof(int));
index += sizeof(int);
memcpy(_buf + index, &titlesize, sizeof(int));
index += sizeof(int);
for (int i = 0; i < titlesize; i++)
{
memcpy(_buf + index, &title[i], sizeof(char));
index += sizeof(char);
}
Sendn(_buf, bufsize);
delete[] _buf;
return;
}
答案 0 :(得分:2)
char *_buf = new char[bufsize];
_buf = { 0 };
这不会将_buf
所指向的动态分配数组零填充。它将指针_buf
设置为空指针。由于_buf
是空指针,以后尝试对其取消引用会导致未定义的行为。
在这种情况下,无需对_buf
所指向的数组进行零填充,因此只需删除_buf = { 0 };
行即可。
一旦解决了这个问题,您就没有分配正确的内存量。 sizeof(title)
不会给您title
保留的字符数。它只是为您提供std::string
对象的静态大小,该对象通常只是一个指针和两个整数。请改用title.size()
。
答案 1 :(得分:0)
您正在尝试将title
的内容以及其他3个整数复制到_buf
中,对吗?问题在于sizeof(title)
不是存储在title
中的字符串的长度。为了获得title
的长度,您需要像这样在类型length
上调用成员函数std::string
:
auto titlesize = title.length();
sizeof
运算符仅提供堆栈上std::string
对象的大小(相比之下,实际字符串存储在堆中),sizeof
表达式始终是常量表达式。在我的计算机上,sizeof(std::string)
是24,无论实际字符串是什么。