如何在c++中返回局部数组
How to return local array in C++?
char *recvmsg(){
char buffer[1024];
return buffer;
}
int main(){
char *reply = recvmsg();
.....
}
我得到一个警告:
返回本地变量或临时
的地址
我建议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
。
你需要动态分配你的字符数组:
char *recvmsg(){
char* buffer = new char[1024];
return buffer;
}
用于c++和
char *recvmsg(){
char* buffer = malloc(1024);
return buffer;
}
对c . 如果没有动态分配,变量将驻留在函数的堆栈中,因此在退出时将被销毁。所以你才会收到警告。在堆上分配它可以防止这种情况,但是您必须小心,并在通过delete[]
使用它后释放内存。
提示信息正确。你返回的是一个局部数组的地址,该地址在函数返回后消失。
你可以使用动态内存分配:
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);
}
这避免了内存分配的需要。
问题是buffer
存在于堆栈中,并且在退出recvmsg
的那一刻超出了作用域。
可以在堆上分配buffer
:
char *recvmsg(){
char *buffer = malloc(1024);
return buffer;
}
注意,现在调用者负责处置分配的内存:
void main(){
char *reply = recvmsg();
free(reply);
}
你有几个选择…你现在这样做会导致未定义的行为,因为一旦函数返回,数组就会超出作用域。所以一个选择是动态分配内存..
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;
}
char *recvmsg(){
char *buffer = new char;
cout<<"nENTER NAME : ";
cin>> buffer;
return buffer;
}
int main(){
char *reply = recvmsg();
cout<<reply;
}
只是为了完成图片:
没有必要用malloc分配内存。您也可以在堆栈上创建缓冲区,但必须在与缓冲区的使用者存活时间相同的堆栈帧上创建它。这是OP的错误——当调用者完成时,缓冲区被删除,调用者得到一个无效的指针。
那么你可以这样做:
void recvmsg(char *buffer, size_t size) {
... do what you want ...
}
void main(void) {
char buffer[1024];
recvmsg(buffer, sizeof(buffer));
}
可以动态创建缓冲区,但是调用者需要知道如何释放它。
我认为最好传入一个缓冲区(假设recvmsg也填充它)
void recvmsg(char *buffer, size_t size){
}
void main(){
char buffer[1024];
recvmsg(buffer, sizeof(buffer));
}
即使调用者认为动态更好,他们也会知道他们需要释放它,以及释放它的具体方法(free(), delete, delete[],或者可能是自定义分配器的特殊方法)
问题是您正在返回指向堆栈上分配的缓冲区的指针。一旦函数返回,该缓冲区将不再有效。
您正在recvmsg
函数内部的堆栈上分配数组。返回指向该内存的指针,如果它被解引用,在某些时候会导致未定义的行为,因为当函数退出时内存将被清理。
如果你想返回一个指向内存的指针,你需要使用malloc
动态分配它。
当你返回缓冲区时,它作为指向数组第一个位置的指针,因此它将返回其地址。在你调用函数的地方,你可以创建一个字符指针,它将存储返回的地址值。之后,你可以移动你的指针,并可以访问数组的所有元素。
如何通过ref
char buf[1024];
PutStuffInBuff(&buf);
- C++返回 Numpy 数组的 Python 扩展模块
- 如何从COM模块中的函数返回字符串数组?
- 从非托管 C# DLL 返回列表/数组
- 如何在C++中的单行中返回常量数组中的值
- 如何使用 PHPCPP 传递对象数组,遍历每个对象并返回关联数组
- 返回 2D 数组(在 C# 和 C++ 中)
- 从我的对象返回静态数组
- 将 2D 数组作为函数参数,并返回 2D 数组作为函数的返回类型
- C++返回自动数组
- 通过 Pybind11 返回 numpy 数组
- 函数可以返回 2D 数组吗?
- 动态使用返回的数组,如何释放其内存
- 根据另一个数字的可整除性返回子数组中的索引
- 按引用返回指针数组
- 返回处理数组的INT功能
- 从方法返回的数组上的 C++ 分割错误
- 如何使用 c++ 中的函数返回 char 数组的大小
- 从 C# 到C++和返回的数组,没有不安全的代码
- 从类返回 2D 数组指针
- 无法使用函数 C++ 返回 char 数组