所以我得到了某种错误,在我的数组输入后,代码就不会运行了。我想看看我的方法是否错误,将数组地址作为函数参数输入,然后用它来求解
//查找数组的最大元素,并返回其地址。使用功能
这就是代码:
#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);