-1

它是否正确?我有一个要传递给 void 函数的指针,然后我想覆盖

void Foo(char *myReturn)
{
   char myOutput[] = "Foobar";
   myReturn = myOutput;
}
int main()
{
   char *myTestVar;
   Foo(myTestVar);
   cout << myTestVar;
}

这只是崩溃而没有错误日志。

现在我已经尝试过myReturn = &myOutput*myReturn = &myOutput(这就是我认为它是如何工作的,除非我误解了某些东西)但我总是得到

:|error: invalid conversion from 'char (*)[(((unsigned int)(((int)length) + -0x000000001)) + 1)]' to 'char'|
4

4 回答 4

4

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

于 2013-10-27T06:42:11.337 回答
4

myOutput[]是函数中的局部变量foo()。您将地址分配myOutputmyReturn

myReturn = myOutput;    // myReturn & myOutput have same address

然后该功能完成myOutput并被删除。myTestVar,您传递给函数foo(),现在指向一个无效的内存位置。这就是你得到错误的原因。试试这个:

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

myReturnmyOutput具有相同的值,但myReturn指向与 . 不同的内存地址myOutput

于 2013-10-27T06:57:22.760 回答
2

这是错误的,因为是使用自动存储char myOutput[]分配的,这意味着当超出范围时它将被删除。因此,如果您确实在函数之外使用它,那么您就是在调用未定义的行为

于 2013-10-27T06:41:39.190 回答
1

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

于 2013-10-27T06:41:48.620 回答