3 回答

TA貢獻1831條經驗 獲得超10個贊
您需要動態分配char數組:
char *recvmsg(){
char* buffer = new char[1024];
return buffer;
}
對于C ++和
char *recvmsg(){
char* buffer = malloc(1024);
return buffer;
}
對于C。
發生的是,沒有動態分配,您的變量將駐留在函數的堆棧上,因此將在退出時被銷毀。這就是為什么您會收到警告。在堆上分配它可以防止這種情況,但是一旦使用完,就必須小心并釋放內存delete[]。

TA貢獻1841條經驗 獲得超3個贊
我建議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(如上所示)和replyC ++ API。
底線是:盡量避免使用new。如果使用new,則必須自己進行管理,并且delete在不需要時進行管理。

TA貢獻1871條經驗 獲得超13個贊
警告消息是正確的。您將返回一個本地數組的地址,該地址在函數返回后消失。
您可以使用動態內存分配來做到這一點:
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);
}
這避免了內存分配的需要。實際上,這是首選的方法。
- 3 回答
- 0 關注
- 433 瀏覽
添加回答
舉報