任何人都可以解释我为什么会收到错误
无法将int **转换为argument1的int *
我已经看到了所有堆栈溢出的答案,但没有找到解决问题的方法。我的代码
#include<stdio.h>
int* sum(int,int*);
int main()
{
int a=5;
int *b;
*b=6;
int *res;
res=sum(a,&b);
printf("\n%d\n%d\n",a,*b);
printf("%d",*res);
}
int* sum(int x,int *y)
{
x=x+1;
*y=*y+3;
return (&y);
}
这是一个基本问题,但我发现很难解决错误。
答案 0 :(得分:5)
解析度=总和(A,和b);
这里b已经是一个指针(一个未分配的整数指针,可能导致未定义的行为)。所以&amp; b的类型为int **。所以只通过b。
res(a,b);
之后返回&amp; y也是int **类型,如果要返回地址,则将其更改为y(类型为int *)。
return y;
答案 1 :(得分:3)
在你的情况下,
int* sum(int x,int *y)
函数接受int
,int *
,最后返回int *
。现在,在函数定义中,您正在编写
return (&y);
这里。 y
为int *
,因此&y
生成int **
,这是错误的,根据定义的返回类型[函数的e。
变化
return (&y);
到
return y;
当您返回int *
时,y
已经是一个。
接下来,函数调用也会出现同样的概念问题。您需要仅传递res=sum(a,&b);
,而不是b
,因为它已经是指针。
另外,请注意,
main()
的推荐签名为int main(void)
。return
不是函数。您通常不需要围绕它的表达式,特别是当使用变量名 作为表达式时。答案 2 :(得分:2)
任何人都可以解释我为什么会收到错误
查看你的代码片段:
int a=5; /* initializes a to value 5 */
int *b; /* declares pointer b */
*b=6; /* OPS, segfault here */
int *res; /* declares pointer res */
res=sum(a,&b); /* assigning to the address of res */
声明*b = 6;
是错误的,你不应该这样做。您正尝试将值6
分配给未动态分配的指针,并且您尚未将其设置为指向任何地址。
您应该做的是,首先使指针指向变量的地址,例如:
int c = 3;
int *b = &c; /* create a pointer 'b' and make that
pointer point to the address of c */
*b = 6; /* OK */
注意初始化int *b = &c;
,声明然后分配b = &c
之间的外观差异:
int *b; /* declaring a pointer 'b' */
b = &c; /* make that pointer point to address of c */
接下来,您创建一个指针变量&#39; res&#39;并尝试将sum的返回值赋给res的地址:
int *res; /* declaring pointer 'res' */
res = sum(a, &b); /* OPS, 'b' is a pointer */
查看函数&#39; sum&#39;,您尝试将参数int *y
指向b
的地址,但使用指针执行此操作的方法只是省略&
,因此只传递b
:sum(a, b);
现在,sum
的返回值为:
int* sum(int x,int *y) /*
^ sum returns a pointer to int */
根据您的代码,您希望将函数sum
的结果分配给res
的地址,因此您要分配地址< / {{>} y
到res
的地址:
res=sum(a,b); /* calling function sum */
int* sum(int x,int *y) /* 'y' points to address of b */
{
x=x+1;
*y=*y+3;
return y; /* returning the address */
}
当总和返回时,res
指向与y
和b
相同的地址。
使用指针将地址分配给另一个指针的地址,例如:
/* a and c are int's */
int *x = &a;
int *y = &c;
x = &y; /* wrong */
虽然这是正确的:
int *x = &a;
int *y = &c;
x = y; /* ok */
答案 3 :(得分:1)
由于y
是int* y
(指向int
的指针),因此&y
是int**
(指向int*
的指针或指针指向int
)的指针,但您的函数(sum
)必须返回int*
,而不是int**
。您只需将return &y
更改为return y
即可解决此问题。