【问题标题】:C++ returning a char pointer and printingC++ 返回一个 char 指针并打印
【发布时间】:2013-11-06 01:50:52
【问题描述】:

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

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

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

现在我已经尝试过 myReturn = &amp;myOutput 和 *myReturn = &amp;myOutput (除非我误解了某些东西,否则我认为它是这样工作的)但我总是得到 ​​p>

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

【问题讨论】:

  • 你的main 在它的身体周围使用(),而不是{}
  • 谢谢哈哈我输入问题时的错误。虽然不是实际问题(我希望)

标签: c++ pointers char cout


【解决方案1】:

myOutput[] 是函数foo() 中的一个局部变量。你把myOutput的地址分配给myReturn:

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

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

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

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

【讨论】:

  • 也会崩溃,进程终止,状态为 -1073741510(0 分 3 秒)
  • 是的,应该。 myReturn = new char[] 意味着您为它分配了一个新内存,即与 myTestVar 不同。所以,当你的程序来到 cout
  • 那么真的没有办法在没有从 void 函数返回的情况下做到这一点吗?
  • 是的,通过使用数组,即通过引用传递。或通过指针。对于指针,为 myTestVar 分配内存,然后将字符串复制到 Foo() 函数中的 myOutput 中。它会完成这项工作,但是您将面临将“大小”赋予 myTestvar 的问题,因为您不知道要在其中复制多长的字符串。
【解决方案2】:

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

【讨论】:

  • 可以使用strcpy复制字符串。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    这是错误的,因为char myOutput[] 是使用automatic storage 分配的,这意味着它会在超出范围时被删除。因此,如果您确实在函数之外使用它,那么您正在调用undefined behavior。

    【讨论】:

    • 我现在明白了,谢谢。我认为这是我忽略的非常明显的事情。每次都将变量保存在内存中的函数范围让我很兴奋。那么在这种情况下,您会如何建议将存储信息返回到 *myReturn,例如 char[] "foobar"?
    猜你喜欢
    • 1970-01-01
    • 2016-06-10
    • 2020-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多