【问题标题】:passing array address in a function and returninf a pointer在函数中传递数组地址并返回一个指针
【发布时间】:2019-11-18 15:26:18
【问题描述】:

所以我遇到了某种错误,即在我的数组输入后代码没有运行。 我想看看我的方法是否错误,将数组地址作为函数参数输入然后用它来解决

//查找数组的最大元素,并返回其地址。使用函数

这是代码:

    #include<stdio.h>
    int *ReturnMax(unsigned int *NoArray[], unsigned int NoOfTerm)
    {
        int i;
        for(i=0;i<NoOfTerm;i++)
        {
            if(*NoArray[i]>*NoArray[i+1])
            {
                return NoArray[i];
            }
            else
            {
                return NoArray[i+1];
            }
        }

    }
    int main()
    {
        int NumOfTerm,i;
        int *ReturnAddress;
        printf("Enter number of Terms:\n");
        scanf("%d",&NumOfTerm);

        int NumArray[NumOfTerm];
        printf("Enter the Array : \n");
        for(i=0;i<NumOfTerm;i++)
        {
            scanf("%d",&NumArray[i]);
        }
        *ReturnAddress=ReturnMax(&NumArray[NumOfTerm],NumOfTerm);
        printf("The Max number is %d and its Address is %d",*ReturnAddress,ReturnAddress);
        return 0;

}

【问题讨论】:

    标签: c function pointers segmentation-fault


    【解决方案1】:

    对于初学者的功能

    int *ReturnMax(unsigned int *NoArray[], unsigned int NoOfTerm)
    {
        int i;
        for(i=0;i<NoOfTerm;i++)
        {
            if(*NoArray[i]>*NoArray[i+1])
            {
                return NoArray[i];
            }
            else
            {
                return NoArray[i+1];
            }
        }
    
    }
    

    没有意义。

    至少返回类型应该是unsigned int *

    函数的第一个参数的类型为unsigned int *NoArray[]。由编译器调整为unsigned int **NoArray类型。

    你需要像这样声明数组

    unsigned int NumArray[NumOfTerm];
    

    你正在调用这个函数

    *ReturnAddress=ReturnMax(&NumArray[NumOfTerm],NumOfTerm);
    

    也就是说,您正在传递一个指向数组之外的内存的指针,该数组的类型为 unsigned int *,因为索引的有效范围是 [0, NumOfTerm)

    而且指针ReturnAddress没有初始化。

    在这个 printf 调用中

        printf("The Max number is %d and its Address is 
    

    使用了无效的格式说明符。

    函数可以通过以下方式定义

    unsigned int * ReturnMax( const unsigned int NoArray[], size_t NoOfTerm )
    {
        const unsigned int *max = NoArray;
    
        for ( size_t i = 1; i < NoOfTerm; i++ )
        {
            if ( *max < NoArray[i] ) max = NoArray + i;
        }
    
        return ( unsigned int * )max;
    }
    

    并像这样称呼

        ReturnAddress = ReturnMax( NumArray, NumOfTerm );
        printf("The Max number is %u and its Address is %p", *ReturnAddress, ( void * )ReturnAddress);
    

    这是一个演示程序

    #include <stdio.h>
    
    unsigned int * ReturnMax( const unsigned int NoArray[], size_t NoOfTerm )
    {
        const unsigned int *max = NoArray;
    
        for ( size_t i = 1; i < NoOfTerm; i++ )
        {
            if ( *max < NoArray[i] ) max = NoArray + i;
        }
    
        return ( unsigned int * )max;
    }
    
    int main(void) 
    {
        size_t NumOfTerm;
        unsigned int *ReturnAddress;
    
        printf( "Enter number of Terms: " );
        scanf( "%zu", &NumOfTerm );
    
        unsigned int NumArray[NumOfTerm];
    
        printf( "Enter the Array:\n" );
    
        for ( size_t i = 0; i < NumOfTerm; i++ )
        {
            scanf( "%u", &NumArray[i] );
        }
    
        ReturnAddress = ReturnMax( NumArray, NumOfTerm );
    
        printf( "The Max number is %u and its Address is %p",
                *ReturnAddress, ( void * )ReturnAddress );
    
        return 0;
    }
    

    如果输入

    10
    0 1 2 3 4 5 6 7 8 9
    

    那么程序输出可能看起来像

    Enter number of Terms: 10
    Enter the Array:
    0 1 2 3 4 5 6 7 8 9
    The Max number is 9 and its Address is 0x7ffdb3333194
    

    【讨论】:

    • 它有效,但我仍然无法理解上述更正如何纠正分段错误。
    • @PranayKatyal 这个表达式 &NumArray[NumOfTerm] 是索引为 NumOfTerm 的数组中不存在的元素的地址。但是您需要传递数组第一个元素的地址。使用隐式转换为指向第一个元素的指针的表达式 NumArray 或表达式 &NumArray[0]。
    • 哦,这就是我猜它显示分段错误的原因
    【解决方案2】:

    你打电话给ReturnMax

    *ReturnAddress = ReturnMax(&NumArray[NumOfTerm],NumOfTerm);
    

    这会将地址传递给函数NumArray[NumOfTerm],这超出了数组的范围,这可能是程序抛出错误的原因。如果您将功能更改为,您也可以传递*ReturnAddress = ReturnMax(NumArray,NumOfTerm);

    int *ReturnMax(unsigned int *NoArray, unsigned int NoOfTerm)
    

    另一件事是,如果您想比较包含的值,则不需要取消引用 if(*NoArray[i]&gt;*NoArray[i+1])。应该是

    if(NoArray[i]>NoArray[i+1])
    

    改为 此外,如果你想打印一个指针,你应该在你的内部使用%p 而不是%d

    printf("The Max number is %d and its Address is %d",*ReturnAddress,ReturnAddress);
    

    【讨论】:

    • 我会做上述更改
    猜你喜欢
    • 2018-09-23
    • 2013-05-04
    • 1970-01-01
    • 1970-01-01
    • 2012-03-16
    • 2014-03-30
    • 2020-01-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多