我正在尝试在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;
}
我查看了互联网,发现可以将静态或全局声明的数组返回给其他函数。因此,我决定修改我的代码,但是现在的问题是我得到Segmentation fault(core dumped)
,但不知道为什么。有人可以帮我吗?
答案 0 :(得分:3)
您需要在使用之前声明您的方法,像这样:
#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);
| ^
答案 1 :(得分:0)
对于初学者来说,该程序没有意义,并且即使可以编译也具有未定义的行为。
例如在此for循环中
for(i=sizeof(ar);i<=0;i--)
使用了sizeof( int * )
。看来你是说
for(i=sizeof(ar1);i<=0;i--)
该函数返回一个指向本地数组的指针,该指针在退出该函数后将不活动。
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 );
函数number_split
声明为
void number_split(int x)
的返回类型为void。但是您正在使用返回类型将其分配给指针
int n,k,*arr,i=0,l;
// ...
arr=number_split(n);
函数reverse
必须在函数number_split
之前声明。
答案 2 :(得分:0)
number_split
被定义为不返回任何内容:
void number_split(int x)
但是您希望它返回一些东西:
arr=number_split(n);
即使您将其定义为返回正确的类型,也将是
int *number_split(int x)
您让它返回 local 变量arr
。但是该变量在函数返回后将不存在。因此,您要么需要向其传递要返回结果的数组,要么让它使用malloc
分配内存。我把它留给你做练习。