char *recvmsg(){
char buffer[1024];
return buffer;
}
int main(){
char *reply = recvmsg();
.....
}
我收到一个警告:
警告 C4172:返回局部变量或临时对象的地址
char *recvmsg(){
char buffer[1024];
return buffer;
}
int main(){
char *reply = recvmsg();
.....
}
我收到一个警告:
警告 C4172:返回局部变量或临时对象的地址
std::vector<char>
:std::vector<char> recvmsg()
{
std::vector<char> buffer(1024);
//..
return buffer;
}
int main()
{
std::vector<char> reply = recvmsg();
}
如果你的代码中需要使用 char*
,那么随时可以使用 &reply[0]
。例如:
void f(const char* data, size_t size) {}
f(&reply[0], reply.size());
完成了。这意味着,如果你正在使用C API,那么你仍然可以使用std::vector
,因为你可以像上面所示一样传递&reply[0]
到C API,同时将reply
传递给C++ API。
底线是:尽量避免使用new
。如果你使用new
,那么你必须自己进行管理,并且在不需要它时要使用delete
。
std::string
。 - Thomas Matthewschar*
的数据概念化为缓冲区而不是字符串,那么我认为std::vector<char>
比std::string
更好地传达了这一点,没有任何歧义。 - Nawazusing buffer_t = std::vector<char>;
(或者,也许是 using buffer_t = std::string;
),然后使用 buffer_t
;也许更合适一些。(但愿 C++ 有强大的别名!) - Nawaz你需要动态分配你的字符数组:
char *recvmsg(){
char* buffer = new char[1024];
return buffer;
}
适用于C++和
char *recvmsg(){
char* buffer = malloc(1024);
return buffer;
}
对于C语言。
如果没有动态分配内存,你的变量会在函数的堆栈上,因此在退出时被销毁,这就是为什么会出现警告。在堆上分配它可以防止这种情况,但你必须小心并通过delete[]
释放内存。
new
并不代表它是符合C++风格的解决方案。C++风格的解决方案是使用std::vector<char>
而不是裸指针char*
。 - Nawaz警告信息是正确的。您正在返回一个局部数组的地址,该数组在函数返回后消失。
您可以使用动态内存分配来解决这个问题:
char *recvmsg(){
char *buffer = (char*)malloc(1024);
return buffer;
}
要注意的是需要在后面使用 free()
函数释放指针以避免内存泄漏。
或者你可以将缓冲区传递给函数。
void recvmsg(char *buffer,int buffer_size){
// write to buffer
}
void main(){
char buffer[1024];
recvmsg(buffer,1024);
}
这样可以避免进行内存分配,事实上这是推荐的做法。
std::vector<char>
是更好的解决方案。这个答案提供了C风格的解决方案,但问题标记为C++。 - Nawazbuffer
存在于栈上,当你退出recvmsg
函数时就会被释放。buffer
:char *recvmsg(){
char *buffer = malloc(1024);
return buffer;
}
void main(){
char *reply = recvmsg();
free(reply);
}
/* do stuff here*/
,以提高可读性。+1 - Andrejs Cainikovs你有几个选项...目前你的做法会导致未定义行为,因为数组将在函数返回后超出作用域。所以一个选择是动态分配内存...
char * recmsg()
{
char * array = new char[128];
return array;
}
记得使用delete(或者如果你使用了malloc,则使用free)来清理它。其次,你可以使用参数...
void recmsg(char * message, int size)
{
if (message == 0)
message = new char[size];
}
同样的,与之前一样,在这里进行清理也是必要的。同时请注意检查为0,以确保您不会在已经分配了指针的情况下调用new。
最后,您可以使用一个向量(vector)。
std::vector<char> recmsg()
{
std::vector<char> temp;
//do stuff with vector here
return temp;
}
补充一下:
使用malloc分配内存并不是必须的。你也可以在堆栈上创建缓冲区,但是你必须在一个与缓冲区使用者同生命周期的堆栈帧上创建它。这就是OP的错误——当调用者完成时,缓冲区被删除了,调用者得到了一个无效的指针。
所以你可以这样做:
void recvmsg(char *buffer, size_t size) {
... do what you want ...
}
void main(void) {
char buffer[1024];
recvmsg(buffer, sizeof(buffer));
}
char *recvmsg(){
char *buffer = new char;
cout<<"\nENTER NAME : ";
cin>> buffer;
return buffer;
}
int main(){
char *reply = recvmsg();
cout<<reply;
}
你可以动态创建缓冲区,但是调用者需要知道如何释放它。
我认为最好传入一个缓冲区(假设recvmsg也填充它)
void recvmsg(char *buffer, size_t size){
}
void main(){
char buffer[1024];
recvmsg(buffer, sizeof(buffer));
}
如何通过引用传递
char buf[1024];
PutStuffInBuff(&buf);
void main
是错误的。 - PlasmaHHvoid main
,那么它很可能是垃圾。我会推荐一本好的C++入门书籍。 - R. Martinho Fernandes*recvmsg
的返回值作为strcpy
等函数的输入而不进行赋值操作,则可以忽略警告。 - Laurie Stearn