![](/img/trans.png)
[英]Why am i getting the error saying "s undeclared here not in a 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.