C 为什么我得到一个错误,说我的函数类型是冲突的?(编辑)
我正试图在C 为什么我得到一个错误,说我的函数类型是冲突的?(编辑),c,arrays,C,Arrays,我正试图在C中编写一个关于加密类型的代码 我的代码: #包括 整数*数字分割(整数x) { int-arr[5],i=0,j=0; 静态int-ar1[5]; 而(x!=0) { x=x%10; arr[i]=x; ++一,; } 对于(i=4;i您需要在使用方法之前声明方法,如下所示: #include<stdio.h> int* reverse(int* ar); void number_split(int x) { ... arr = number_split(n);
C
中编写一个关于加密类型的代码
我的代码:
#包括
整数*数字分割(整数x)
{
int-arr[5],i=0,j=0;
静态int-ar1[5];
而(x!=0)
{
x=x%10;
arr[i]=x;
++一,;
}
对于(i=4;i您需要在使用方法之前声明方法,如下所示:
#include<stdio.h>
int* reverse(int* ar);
void number_split(int x)
{
...
arr = number_split(n);
因此,问题在于:
int* reverse(int* ar)
{
int ar1[5],i=0,j=0;
// your logic
return ar1;
}
当您返回数组时,该方法将终止,因为该数组是该方法的局部变量,它将超出范围,其生存期将结束(并将被销毁)
这意味着,当调用方希望使用该数组时,内存中没有剩余的数组可供使用,因此调用方将只使用一些充满垃圾的内存
在这里,您可以,在一个正确的程序中,它通常会留在内存中,直到您显式地请求取消分配
表示我的函数类型冲突时出错
因为该方法的原型是:
void number_split(int x);
但你这样称呼它:
#include<stdio.h>
int* reverse(int* ar);
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--)
函数返回一个指向本地数组的指针,该数组在退出函数后将不活动
int ar1[5],i=0,j=0;
//...
return ar1;
还是这个循环
while(x!=0)
{
x=x%10;
arr[i]=x;
++i;
}
由于此语句,最多有两次迭代
x=x%10;
看来你是说
for(i=sizeof(ar1);i<=0;i--)
do
{
arr[i] = x % 10;
++i;
} while ( x /= 10 );
函数number\u split
声明如下
void number_split(int x)
返回类型为void。但您正在使用返回类型将其分配给指针
int n,k,*arr,i=0,l;
// ...
arr=number_split(n);
在函数数字分割
定义为不返回任何内容之前,应声明函数反向
void number_split(int x)
然而,你却期望它会有所回报:
arr=number_split(n);
即使您将其定义为返回正确的类型
int *number_split(int x)
您允许它返回一个局部变量arr
。但该变量在函数返回后将不存在。因此您需要将返回结果的数组传递给它,或者让它使用malloc
分配内存。我将此作为练习留给您。sizeof(arr)
是指针的大小吗?让我想想。可能不是您所需要的。请提供完整的错误消息。您在哪里使用动态内存分配?如何在不使用任何malloc和朋友的情况下进行分配?好的,我在这个网站上查过,我在这里使用了代码。请不要发明缩写“DMA”因为它已经被占用,意味着直接访问内存。但问题是,void方法number\u split
调用另一个非void方法reverse
,它返回一个数组,我正在尝试获取该数组。因此arr=number\u split(n);
。那么@FMA?number\u split()
的原型返回void。如果您也想从该方法返回某些内容,则还需要更改返回类型。