我试图理解函数中的指针返回类型。 以下示例生成类型转换错误。
#include <iostream>
using namespace std;
int* abc(int* y)
{
int x=y;
int *z = &x;
x++;
return z;
}
int main()
{
int *a = abc(100);
int b = *a;
cout << a <<endl;
cout << b <<endl;
return 0;
}
错误信息是: -
In function 'int* abc(int*)': 6:11: error: invalid conversion from 'int*' to 'int' [-fpermissive]
In function 'int main()': 14:19: error: invalid conversion from 'int' to 'int*' [-fpermissive]
4:6: note: initializing argument 1 of 'int* abc(int*)'
如何解决上述错误以及以下函数形式与其适当的调用语法之间的区别,
答案 0 :(得分:2)
中的参数类型
int* abc(int* y)
是int*
。当你调用这个函数时,
int *a = abc(100);
您正在传递100
,int
。它不是指向int
的指针。
您可以使用以下方法解决问题:
选项1
更改参数类型。
int* abc(int y) { ... }
选项2
更改您调用该函数的方式。
int x = 100;
int *a = abc(&x);
如果您按照此选项,
该行
int x=y;
需要修改。 y
的类型为int*
,而非int
。您必须将该行更改为:
int x=*y;
<强>问题强>
您正在从函数返回局部变量的地址。在调用函数中取消引用该地址是未定义的行为。
当您从函数返回地址并且调用函数取消引用该地址时,该地址需要在调用函数中有效。一种方法是使用malloc
从堆中分配内存。
int* abc(int* y)
{
int* x = malloc(sizeof(int));
*x = (*y + 1);
return x;
}
当你这样做时,你必须记得在调用函数中调用free
。
int x = 100;
int *a = abc(&x);
// Use a
// Deallocate memory
free(a);
答案 1 :(得分:0)
问题不在于您的退货类型。你的问题就在这一行:
int x=y;
此处y
是指针,您尝试将其分配给x
int
。
您还将100
文字int
传递给abc
函数,该函数将指针作为参数。
最后,您提供的3种功能的类型没有区别。在这种情况下,空白是无足轻重的。
答案 2 :(得分:0)
两个函数中的前两个语句都不正确。当main
调用abc
时,100不是指针,盲目地将y
分配给x
将无效,因为前者是int
而后者是一个int
指针。