c-在函数中传递数组地址,并返回一个指针



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

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

这就是代码:

#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;
}

对于启动器,函数

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);

也就是说,由于索引的有效范围是[0, NumOfTerm),您正在将指针传递到具有类型unsigned int *的数组之外的内存。

此外,指针CCD_ 6没有被初始化。

在这次打印的调用中

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

您正在使用调用ReturnMax

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

这将传递给函数NumArray[NumOfTerm]的地址,该地址在数组的边界之外,这可能就是程序抛出错误的原因。此外,如果您将函数更改为:,则可以通过*ReturnAddress = ReturnMax(NumArray,NumOfTerm);

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

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

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

相反此外,如果你想打印指针,你应该在中使用%p,而不是%d

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

最新更新