Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.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++ 如何返回函数中创建的字符数组?_C++_String_Scope_Char - Fatal编程技术网

C++ 如何返回函数中创建的字符数组?

C++ 如何返回函数中创建的字符数组?,c++,string,scope,char,C++,String,Scope,Char,我编程很糟糕已经有一段时间了,我才真正意识到。我以前创建过许多函数,它们以字符数组的形式返回字符串(或者至少返回指向字符串的指针) 前几天有人指出,当我的函数返回时,我的函数指向的字符数组已经超出了范围,我现在基本上指向了一个随机内存位(一个讨厌的悬空指针) 我有一段时间没有注意到这一点,因为输出到控制台的字符数组似乎没有损坏(可能是因为没有时间覆盖该数据)。但是,当我返回一个字符串缓冲区(char数组)时,我注意到了这一点,该字符串缓冲区是通过读取串行端口生成的,串行端口经常被损坏 那么,我应

我编程很糟糕已经有一段时间了,我才真正意识到。我以前创建过许多函数,它们以字符数组的形式返回字符串(或者至少返回指向字符串的指针)

前几天有人指出,当我的函数返回时,我的函数指向的字符数组已经超出了范围,我现在基本上指向了一个随机内存位(一个讨厌的悬空指针)

我有一段时间没有注意到这一点,因为输出到控制台的字符数组似乎没有损坏(可能是因为没有时间覆盖该数据)。但是,当我返回一个字符串缓冲区(char数组)时,我注意到了这一点,该字符串缓冲区是通过读取串行端口生成的,串行端口经常被损坏

那么,我应该怎样做才是最好的呢

我的坏代码如下:

#include <cstdlib>
#include <iostream>

using namespace std;

char* myBadFunction(){
    char charArray[] = "Some string\n";
    char* charPointer = charArray;
    return charPointer;
}


int main(int argc, char** argv) {

    cout << myBadFunction();

    return 0;
}
#包括
#包括
使用名称空间std;
char*myBadFunction(){
char charArray[]=“某些字符串\n”;
char*charPointer=charArray;
返回指针;
}
int main(int argc,字符**argv){

cout最简单的方法是返回一个
std::string
,如果需要访问内部字符数组,请使用
std::string::c_str()

#包括
#包括
使用名称空间std;
字符串myGoodFunction(){
char charArray[]=“某些字符串\n”;
返回字符串(charArray);
}
intmain(intargc,字符**argv){

CUT

你有两种选择:在C++中返回一个数组。可以填充预分配的内存(好),或者在函数内分配自己的内存并返回它(坏的)。首选的原因是它重新强制分配内存的正确处理。 基本示例如下所示:

void fillArray(char* buffer, int sz) {
  char text[] = "hello there!";
  if (sizeof(text)>sz) {
    // overflow! Buffer is too small!
    return;
  }
  for (int n=0;n<sizeof(text);n++) {
    buffer[n] = text[n];
  }
}

int main() {
  char* buffer = new char[30]; // allocates a buffer of 30 bytes.
  fillArray(buffer,30);
  cout << buffer;
  delete [] buffer;
}

/* note that it would be easier to use static memory in this example */
void fillArray(字符*缓冲区,int sz){
char text[]=“你好!”;
if(sizeof(text)>sz){
//溢出!缓冲区太小!
返回;
}
对于(int n=0;n将数组声明为“static”变量,并返回其地址。
此代码有效,但会导致警告:

#include <cstdlib>
#include <iostream>
using namespace std;

char* myBadFunction(){
    static char charArray[] = "Some string\n";    // insert "static"
    // char* charPointer = charArray;  
    return charArray;             // charArray is a pointer to the static array
}                                 // after returning static varibles stay safe
int main(int argc, char** argv) {
    cout << myBadFunction();
    return 0;
}
#包括
#包括
使用名称空间std;
char*myBadFunction(){
静态字符字符[]=“某些字符串\n”;//插入“静态”
//char*charPointer=charArray;
return charArray;//charArray是指向静态数组的指针
}//返回静态变量后,请保持安全
int main(int argc,字符**argv){
cout“Some string\n”是一个字符串文本,因此在程序的生命周期内都会存在,因此以下内容是有效的:

#include <cstdlib>
#include <iostream>

using namespace std;

char* myGoodFunction(){
    char* charPointer = "Some string\n";
    return charPointer;
}

int main(int argc, char** argv) {
    cout << myGoodFunction();

    return 0;
}
#包括
#包括
使用名称空间std;
char*myGoodFunction(){
char*charPointer=“一些字符串\n”;
返回指针;
}
int main(int argc,字符**argv){

您是否最好在标签中添加您编写的代码类型。关于问题的第二部分,您必须使用手动循环并将每个字符复制到第二个数组中,或者使用
memcpy
…我不同意。虽然这解决了当前的问题,但它并没有解释使用其他类型数组的问题。我不会对此投反对票这是不公平的,但更好的答案可以解释他的初始代码的问题。@Alexander:这一点很好。我已经更新了答案以反映您的评论。这是有效的,我将在一分钟内勾选它。因此,我正确地认为返回的字符串不会超出范围,因为它是对象返回类型,但字符数组会超出范围,因为它只是一个点呃,不是整个数组都返回了吗?@Zac:从概念上讲,首先从char数组中创建一个临时字符串对象。然后,这个临时对象会在销毁之前复制到客户端。从技术上讲,这个副本经常被优化掉。好吧,我仍然有一个问题,不确定我应该在这里写它还是创建一个新线程。我需要h使用字符数组而不是字符串类型纯粹是因为字符数组用于包含泵端口名称,即“COM7”,并用作createfile()函数中的参数,以打开端口进行写入(实际上是字符指针)。此函数不接受字符串类型。这解决了除调用new[]和delete[]之外的问题?另外,如果添加的字符串是由cin>>字符串动态分配的,该怎么办?内部函数应该让谁知道传递给它的缓冲区的大小?你在主函数中分配内存。除非有可能发生溢出,否则函数不需要知道缓冲区的大小。我会为你更新我的答案。当静态数组使用的内存会被释放吗?我必须自己释放吗?
void fillArray(char* buffer, int sz) {
  char text[] = "hello there!";
  if (sizeof(text)>sz) {
    // overflow! Buffer is too small!
    return;
  }
  for (int n=0;n<sizeof(text);n++) {
    buffer[n] = text[n];
  }
}

int main() {
  char* buffer = new char[30]; // allocates a buffer of 30 bytes.
  fillArray(buffer,30);
  cout << buffer;
  delete [] buffer;
}

/* note that it would be easier to use static memory in this example */
#include <cstdlib>
#include <iostream>
using namespace std;

char* myBadFunction(){
    static char charArray[] = "Some string\n";    // insert "static"
    // char* charPointer = charArray;  
    return charArray;             // charArray is a pointer to the static array
}                                 // after returning static varibles stay safe
int main(int argc, char** argv) {
    cout << myBadFunction();
    return 0;
}
#include <cstdlib>
#include <iostream>

using namespace std;

char* myGoodFunction(){
    char* charPointer = "Some string\n";
    return charPointer;
}

int main(int argc, char** argv) {
    cout << myGoodFunction();

    return 0;
}