簡體   English   中英

為什么我收到一條錯誤消息,提示我的 function 類型沖突? (已編輯)

[英]Why am I getting an error saying that my function type is conflicting? (edited)

我正在嘗試在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,i=0,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;
}

我上網查了一下,發現 static 或者全局聲明的 arrays 可以返回到其他函數。 所以,我決定修改我的代碼,但現在的問題是我得到Segmentation fault(core dumped) ,我不知道為什么。 有人可以幫幫我嗎?

您需要在使用它之前聲明您的方法,如下所示:

#include<stdio.h>

int* reverse(int* ar);
void number_split(int x)
{
  ...

或者,當然,您可以在使用它之前簡單地移動反向方法的定義,即在定義數字拆分方法之前。


所以我嘗試使用動態 memory 分配

不,我的意思不是據我所知,在您的代碼中的任何地方都沒有動態 memory 分配。

您使用的是本地定義的數組,這就是您收到此警告的原因(通過在編譯器中啟用警告,例如 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;
  }

當您返回數組時,該方法將終止,並且由於該數組是該方法的局部變量,因此它將 go 超出 scope,其生命周期將結束(並將被銷毀)。

這意味着,當調用者想要使用該數組時,memory 中沒有剩余的數組可供使用,因此調用者將只使用一些填充垃圾的 memory。

在這里,您可以動態分配數組,在正確的程序中,它通常會保留在 memory 上,直到您明確要求取消分配。


錯誤說我的 function 類型沖突?

因為方法的原型是:

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--)

並且 function 返回一個指向本地數組的指針,該數組在退出 function 后將不再存在。

int ar1[5],i=0,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 );

function number_split聲明如下

void number_split(int x)

返回類型為 void。 但是您正在使用返回類型將其分配給指針

int n,k,*arr,i=0,l;
// ...
arr=number_split(n);

並且 function reverse應在 function number_split之前聲明。

number_split被定義為不返回任何內容:

void number_split(int x)

但是您希望它返回一些東西:

arr=number_split(n);

即使您將其定義為返回正確的類型,也就是

int *number_split(int x)

你讓它返回一個局部變量arr 但是在 function 返回后,該變量將不存在。 因此,您要么需要將返回結果的數組傳遞給它,要么讓它使用malloc 我把它留給你練習。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM