为什么我收到错误消息,说明我的函数类型冲突? (编辑)

我正在尝试在C中编写有关一种加密类型的代码。

我的代码:

#include<stdio.h>


int* number_split(int x)
{
    int arr[5],i=0,j=0;
    static int ar1[5];
    while(x!=0)
    {
        x=x%10;
        arr[i]=x;
        ++i;
    }
     for(i=4;i<=0;i--)
    {
        ar1[j]=arr[i];
        ++j;
    }
    return ar1;
}


int main()
{
    int n,k,*arr,l;
    printf("Please enter any number:");
    scanf("%d",&n);
    printf("Please enter a key:");
    scanf("%d",&k);
    arr=number_split(n);
    l=k%5;
    for(i=l;i<4;i++)
    {
        printf("%d\t",arr[i]);
    }
    for(i=0;i<l;i++)
    {
        printf("%d\t",arr[i]);
    }

    return 0;
}

我查看了互联网,发现可以将静态或全局声明的数组返回给其他函数。因此,我决定修改我的代码,但是现在的问题是我得到Segmentation fault(core dumped),但不知道为什么。有人可以帮我吗?

lwword 回答:为什么我收到错误消息,说明我的函数类型冲突? (编辑)

您需要在使用之前声明您的方法,像这样:

#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

大家都在问