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。如果您也想从该方法返回某些内容,则还需要更改返回类型。