Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.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++_Pointers_Char_Cout - Fatal编程技术网

C++返回字符指针和打印

C++返回字符指针和打印,c++,pointers,char,cout,C++,Pointers,Char,Cout,这是正确的吗?我有一个指向void函数的指针,然后我想覆盖它 void Foo(char *myReturn) { char myOutput[] = "Foobar"; myReturn = myOutput; } int main() { char *myTestVar; Foo(myTestVar); cout << myTestVar; } 这是错误的,因为char myOutput[]是使用分配的,这意味着它将在超出范围时被删除。因此,如果您

这是正确的吗?我有一个指向void函数的指针,然后我想覆盖它

void Foo(char *myReturn)
{
   char myOutput[] = "Foobar";
   myReturn = myOutput;
}
int main()
{
   char *myTestVar;
   Foo(myTestVar);
   cout << myTestVar;
}
这是错误的,因为char myOutput[]是使用分配的,这意味着它将在超出范围时被删除。因此,如果您确实在函数之外使用它,那么您正在调用

您的程序具有未定义的行为。myOutput[]是一个具有自动存储的本地数组,它不存在于函数范围之外。

myOutput是Foo的本地数组,在堆上没有分配任何内存。因此,当您试图通过myTestVar访问它时,它没有指向有效的内存位置,并且试图通过它访问数据会使您的程序崩溃。

myOutput[]是函数foo中的一个局部变量。您将myOutput的地址分配给myReturn:

然后函数完成,myOutput被删除。传递给函数foo的myTestVar现在指向无效的内存位置。这就是为什么你会出错。 试试这个:

myReturn = new char[strlen(myOutput)+1];
strcpy(myReturn, myOutput);

myReturn和myOutput的值相同,但myReturn指向的内存地址与myOutput不同。

您的主要用途是围绕其正文,而不是{}谢谢,哈哈,我在键入问题时犯了错误。不是真正的问题,但我希望我现在看到,谢谢。我想这是我忽略的明显的东西。在内存中保存变量的函数的范围每次都让我感到困惑。因此,在本例中,您建议如何将存储信息返回到*myReturn,如char[]foobar?您可以使用strcpy复制字符串。这也会导致进程终止,状态为-1073741510 0分钟3秒。myReturn=new char[]意味着您为它分配了一个不同于myTestVar的新内存。所以,当你的程序到达coutSo行时,如果没有void函数的返回,真的没有办法做到吗?是的,通过使用数组i-e pass by reference。或者用指针。对于指针,将内存分配给myTestVar,然后将字符串复制到Foo函数中的myOutput中。它可以完成这项工作,但您将面临给myTestvar指定“大小”的问题,因为您不知道要在其中复制的字符串长度。
myReturn = myOutput;    // myReturn & myOutput have same address
myReturn = new char[strlen(myOutput)+1];
strcpy(myReturn, myOutput);