Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将std::string复制到char*(用于TCP/IP套接字)_C++_Arrays_String_Qt4_Dynamic Memory Allocation - Fatal编程技术网

C++ 将std::string复制到char*(用于TCP/IP套接字)

C++ 将std::string复制到char*(用于TCP/IP套接字),c++,arrays,string,qt4,dynamic-memory-allocation,C++,Arrays,String,Qt4,Dynamic Memory Allocation,我决定重做这个问题来澄清它, 我目前正在学校的一个项目中工作,我正在创建一个带有TCP/IP套接字的客户机服务器,现在我没有与这些相关的问题 现在我有一个helper函数,它将接收一个指向套接字的指针和一些我将发送到服务器的数据,它将以我想要的字符格式构建一个std::string,然后将其转换为字符数组并发送到服务器 buffer = new char[tempBuffer.size()]; cout << tempBuffer.size() << " ++ " <

我决定重做这个问题来澄清它, 我目前正在学校的一个项目中工作,我正在创建一个带有TCP/IP套接字的客户机服务器,现在我没有与这些相关的问题

现在我有一个helper函数,它将接收一个指向套接字的指针和一些我将发送到服务器的数据,它将以我想要的字符格式构建一个std::string,然后将其转换为字符数组并发送到服务器

buffer = new char[tempBuffer.size()];
cout << tempBuffer.size() << " ++ " << strlen(buffer) << " ++ " << endl;
strcpy(buffer, tempBuffer.c_str());
cout << buffer << "  " << tempBuffer.size() << " ++ " << strlen(buffer) << " ++" << endl;
write (*socket, buffer, strlen(buffer));
delete [] buffer;
buffer=新字符[tempBuffer.size()];

cout
cout如果您正在准备数据传输的缓冲区,而您没有使用
std::vector
和一些非常细致的序列化(或只是使用序列化库),那么您的思考不够深入。您不想发送格式化数据;您希望以特定的形式发送原始数据,以便在客户端进行重构。序列化协议有很好的理由,你最好考虑一下。为什么不直接使用<代码> .cScript()/<代码>直接在<代码>写< /代码>中?代码>写入(*套接字,tempBuffer.c_str(),tempBuffer.size())似乎简单多了…+1,因为我们看不到它,没有办法确定,但我相信
缓冲区
是一个
字符**
。从我看到的情况来看,特别是strcpy()
,这是编译的唯一方法。如果是,那么
sizeof(*buffer)
是指针的大小;不是1。也就是说,这个答案的前提仍然是绝对正确的(相同的问题,只是4或8而不是1),OP最好仔细地消化它。好吧,那么我的困惑是因为cout工作得非常好,我想要的缓冲区是“客户:讲师”,是输出,sizof(*buffer)输出4而不是1,事实上,当我将数据发送到服务器时,它的所有发送都很好,它可以输出所有数据,它看起来与我希望的确切长度完全相同,如果我要声明一个字符数组并调用sizeof(thatArray),我将得到我定义它时设置的大小,“thatArray”这个名字真的是指向字符列表中第一个元素的指针吗?这和我动态分配的字符列表有什么不同?哦,缓冲区是一个
char**
,所以
*buffer
是一个
char*
,指针是平台上的四个字节。区别在于动态分配的字符列表不是C对象。唯一的C对象是指向它的指针。在您的平台上,指针的大小为四个字节。因为它指向一个字符,所以它指向的大小就是一个字符的大小。不存在大小与您分配的字节数相同的语言对象,因此无法将任何内容传递到
sizeof
。我明白了!是的,我一直在使用它的一个黑客,在C++中知道一个字符是一个字节,我可以调用StLLN并与它一起工作,但是当我调用Dele[]缓冲区(它的主要函数,所以它只是一个指针)时,这个错误在我的主要函数中。我得到了一个非常大的GLUBC错误,问题是你想要代码>删除[](*缓冲);代码>。您需要将从
new[]
中获得的内容传递到
delete[]
。你应该把
buffer
a
char*
,这样你就不会到处使用
*buffer
。(每当你看到你使用的每一个地方时,这应该表明你首先使用了错误的类型。)
cout << *buffer << "  " << tempBuffer.size() << " ++ " << sizeof(*buffer) << " ++" << endl;