这是对的吗?我有一个指针,我正在进入一个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'|
答案 0 :(得分:4)
myOutput
是Foo
的本地,并且没有在堆上分配任何内存。因此,当您尝试通过myTestVar
访问它时,它不会指向有效的内存位置,并且尝试通过它访问数据会使您编程崩溃。
答案 1 :(得分:3)
myOutput []是函数foo()中的局部变量。您将myOutput的地址分配给myReturn:
myReturn = myOutput; // myReturn & myOutput have same address
然后完成该功能并删除myOutput。传递给函数foo()的myTestVar现在指向无效的内存位置。这就是你得到错误的原因。 试试这个:
myReturn = new char[strlen(myOutput)+1];
strcpy(myReturn,myOutput);
myReturn和myOutput具有相同的值,但myReturn指向的内存地址与myOutput不同。
答案 2 :(得分:2)
这是错误的,因为char myOutput[]
是使用automatic storage分配的,这意味着当它超出范围时会被删除。因此,如果您在函数之外使用它,那么您正在调用undefined behavior。
答案 3 :(得分:1)
您的程序有未定义的行为。 myOutput[]
是一个具有自动存储功能的本地数组,它不存在于函数范围之外。