C语言 这个返回指针的简单函数的错误是什么?

4bbkushb  于 2023-02-03  发布在  其他
关注(0)|答案(3)|浏览(85)

在这个问题陈述中,我们需要从用户那里得到一个数字数组,然后请求一个他们想要搜索的数字,并给出它的地址。我写了下面的代码,但是经常出错。
如何解决呢?

#include<stdio.h>
#include<conio.h>
int search(int ,int ,int );
main()
{
   int i,a[i],target,*p,n;
   pritnf("enter number of numbers u want");
   scanf("%d",&n);
   printf("enter numbers you want in array");
   for(i=0;i<n;i++)
   {
       scanf("%d",&a[i]);
   }
   printf("enter the number u are searching");
   scanf("%d",&target);
   p=search(a,n,target);
   if(p==NULL)
   {
       printf("target not found");
   }
   else
   {
       printf("target found at %d",p);
   }
}
int search(int a[],int n,int target)
{
    int i;
    for(i=0;i<n;i++)
    {
        if(a[i]==target)
        {
            return &a[i];

        }

    }
}

错误:C:\用户\hp\桌面\无标题1.c|26|错误:"search"的类型冲突|

mcdcgff0

mcdcgff01#

int search(int ,int ,int );

你的声明

int search(int a[],int n,int target)

不符合您的定义。因此出现错误。
要么修正这个问题,要么在main()之前定义函数,这样就不需要任何原型了。
您还使用未定义的变量在main()中定义数组。

int i,a[i];

i的值是不确定的。请在读取输入后声明数组。

sxpgvts3

sxpgvts32#

您将函数声明为int search(int ,int ,int );,带有 * 3个整型参数 *,但定义中提供了指向整型的指针int a[]等于int* a)和 * 2个整型参数 *。
函数声明应为int search(int* ,int ,int );
但是,您的代码存在许多其他问题:

  • 将main函数定义为int main(void)int main(int argc, char **argv)是一个很好的做法,使其返回一个整数值(通常0表示 * success *,正值或负值表示 * failure *)。What should main() return in C and C++?;
  • 第一个printf()拼写错误:"printnf",这会产生一个 * 隐式声明警告 *,并且由于一个名为printnf的函数没有在任何地方声明,编译失败;
  • 您将search()的整数返回值赋给pp是一个类型为"指向整数的指针"的变量,这会生成一个"隐式整数转换警告";
  • 你的搜索函数应该只返回a[i],而现在它返回的是&a[i],它是一个指向整数的指针,这也会产生一个"隐式整数转换警告";
  • 在另一个答案中由Haris概括的那些。

我建议您打开编译器警告,并特别注意它告诉您的内容,因为所有这些问题都可以通过查看它们来轻松避免。

vxf3dgd4

vxf3dgd43#

让我们从头开始。
头文件<conio.h>不是一个标准的头文件,程序中也没有使用头文件的声明。

#include<conio.h>

可以被去除。
函数search是使用int类型的三个参数声明的

int search(int ,int ,int );

也就是说,它不接受数组。
函数的返回类型也是int,而不是指针类型。
注意,函数不会改变传递的数组,所以函数声明如下所示

int * search( const int[] ,size_t , int );

第二个参数指定传递的数组中的元素数,它的类型为无符号整数size_t,而不是有符号整数int。也就是说,数组中的元素数不能为负值。因此,将此参数声明为有符号整数类型没有意义。
此外,如果在数组中找不到目标元素,则函数不返回任何内容。
在本声明中

int i,a[i],target,*p,n;

你声明了一个可变长度的数组a[i]。但是变量i还没有初始化。所以这个声明是无效的并且会导致未定义的行为。
此外,数组中元素的数量存储在变量n中:

pritnf("enter number of numbers u want");
scanf("%d",&n);

因此,您需要在变量n获得其值之后声明数组。
printf的调用中

printf("target found at %d",p);

使用了带指针的无效转换说明符%d。这将调用未定义的行为。
您至少需要使用转换说明符%p,而不是%d
最后,函数main应具有返回类型int

int main( void )

程序可以看起来像下面这样。

#include <stdio.h>

int * search( const int[], size_t, int );

int main( void )
{
    size_t n = 0;

    pritnf( "enter number of numbers u want: " );
   
    if ( scanf( "%zu", &n ) == 1 && n != 0 )
    {
        int a[n]; 
        int target = 0;
        int *p = NULL;

        printf( "enter numbers you want in array\n" );

        for ( size_t i = 0; i < n; i++ )
        {
            scanf( "%d", a + i );
        }

        printf( "enter the number u are searching: " );
        
        scanf( "%d", &target );

        p = search( a, n, target );

        if ( p == NULL )
        {
            printf( "target not found\n" );
        }
        else
        {
            printf( "target found at %p\n", ( void * )p );
        }
    }
}

int * search( const int a[], size_t n, int target )
{
    const int *p = NULL;

    if ( n != 0 )
    {
        p = a;

        while ( p != a + n && *p != target ) ++p;

        if ( p == a + n ) p = NULL;
    }

    return ( int * )p;
}

相关问题