您需要在使用之前声明您的方法,像这样:
#include<stdio.h>
int* reverse(int* ar);
void number_split(int x)
{
...
或者,当然,您可以在使用反向方法之前简单地移动它的定义,即在定义数字拆分方法之前。
所以我尝试使用动态内存分配
不,我的意思是,就我所知,代码中没有动态内存分配。
您使用的是本地定义的数组,这就是为什么收到此警告的原因(通过在编译器中启用警告,例如GCC中的Wall,Wextra标志)
main.c:24:12: warning: function returns address of local variable [-Wreturn-local-addr]
24 | return ar1;
| ^~~
所以这里的问题:
int* reverse(int* ar)
{
int ar1[5],i=0,j=0;
// your logic
return ar1;
}
在返回数组时,该方法将终止,并且由于该数组是该方法的局部变量,因此它将超出范围,其寿命将结束(并将被销毁)。
这意味着,当调用方想使用该数组时,内存中将没有可用的数组,因此调用方将只使用一些充满垃圾的内存。
在这里,您可以 dynamically allocate the array,通常在正确的程序中,它将保留在内存中,直到您明确要求取消分配为止。
错误提示我的函数类型冲突?
因为该方法的原型是:
void number_split(int x);
但是您这样称呼它:
arr = number_split(n);
即使其返回类型为void。因此,警告:
main.c:34:8: error: void value not ignored as it ought to be
34 | arr=number_split(n);
| ^
,
对于初学者来说,该程序没有意义,并且即使可以编译也具有未定义的行为。
例如在此for循环中
for(i=sizeof(ar);i<=0;i--)
使用了sizeof( int * )
。看来你是说
for(i=sizeof(ar1);i<=0;i--)
该函数返回一个指向本地数组的指针,该指针在退出该函数后将不活动。
int ar1[5],j=0;
//...
return ar1;
或者这个循环
while(x!=0)
{
x=x%10;
arr[i]=x;
++i;
}
由于该语句,最多有两次迭代
x=x%10;
看来你的意思
do
{
arr[i] = x % 10;
++i;
} while ( x /= 10 );
函数number_split
声明为
void number_split(int x)
的返回类型为void。但是您正在使用返回类型将其分配给指针
int n,k,*arr,l;
// ...
arr=number_split(n);
函数reverse
必须在函数number_split
之前声明。
,
number_split
被定义为不返回任何内容:
void number_split(int x)
但是您希望它返回一些东西:
arr=number_split(n);
即使您将其定义为返回正确的类型,也将是
int *number_split(int x)
您让它返回 local 变量arr
。但是该变量在函数返回后将不存在。因此,您要么需要向其传递要返回结果的数组,要么让它使用malloc
分配内存。我把它留给你做练习。
本文链接:https://www.f2er.com/3158289.html