我英語說的不好。我宣告陣列和兩個指標。
maxPtr 指標應該具有陣列 arr 的最大數字地址。并且 minPtr 指標應該具有陣列 arr 的最小數字地址。
所以我宣告了這個函式,它有兩個雙指標來給 maxPtr 和 minPtr 正確的地址。
但是每當我運行這段代碼時,程式都沒有完全運行。它不輸出結果( printf("%d",*maxPtr) ,printf("%d", *minPtr, printf("Hi"); 這個程式在 mac 中的 vscode 上運行。是什么讓它出錯?
#include <stdio.h>
void MaxAndMin(int* str,int** max, int** min)
{
int i;
int maxnum=0,minnum=0;
for(i=0; i<5; i )
{
if(maxnum< str[i])
{
maxnum =str[i];
*max = &str[i];
}
if(minnum > str[i])
{
minnum = str[i];
*min = &str[i];
}
}
}
int main(void)
{
int i,len;
int* maxPtr;
int* minPtr;
int arr[5]={};
for(i=0; i<5; i )
{
printf("%d?? ???? ???.",i 1);
scanf("%d", &arr[i]);
}
MaxAndMin(arr,&maxPtr,&minPtr);
printf("%d",*maxPtr);
printf("%d",*minPtr);
printf("Hi");
return 0;
}
結果是
> Executing task: ./test <
1?? ???? ???.1
2?? ???? ???.2
3?? ???? ???.3
4?? ???? ???.4
5?? ???? ???.5
Terminal will be reused by tasks, press any key to close it.
uj5u.com熱心網友回復:
對于初學者來說,這個陣列的初始化
int arr[5]={};
在 C 中是不正確的。你必須寫
int arr[5]={ 0 };
其次,在函式中使用幻數5會使函式通常無用。您需要將陣列的大小傳遞給函式。
初始值 0
int maxnum=0,minnum=0;
這些變數使函式的用處更小。通常,該陣列可以包含所有正元素或所有負元素。
'\n'并且您需要使用例如呼叫中的換行符來重繪 輸出緩沖區printf。
該函式可以通過以下方式宣告和定義,如下面的演示程式所示。
#include <stdio.h>
void MaxAndMin( const int a[], size_t n, int **max, int **min )
{
*max = ( int * )a;
*min = ( int * )a;
for ( size_t i = 1; i < n; i )
{
if ( **max < a[i] )
{
*max = ( int *)( a i );
}
else if ( a[i] < **min )
{
*min = ( int * )( a i );
}
}
}
int main( void )
{
int a[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
const size_t N = sizeof( a ) / sizeof( *a );
int *maxPtr = NULL;
int *minPtr = NULL;
MaxAndMin( a, N, &maxPtr, &minPtr );
printf( "The maximum value is %d at position %tu\n",
*maxPtr, maxPtr - a );
printf( "The minimum value is %d at position %tu\n",
*minPtr, minPtr - a );
}
程式輸出為
The maximum value is 9 at position 9
The minimum value is 0 at position 0
注意函式的第一個引數應該有限定符const,因為傳遞給函式的陣列在函式內不會改變。
uj5u.com熱心網友回復:
主要問題是 minnum 設定為零,這僅在陣列具有負值時才有效。
設定minimum = star[0]也不行!!!因為在 str[0] 具有負值的情況下, *min 永遠不會改變。
另外,我建議始終初始化宣告中的所有變數,尤其是指標(因為它們理論上可能會導致意外訪問記憶體)。
完整解決方案:
#include <stdio.h>
int MaxAndMin(int* str, int** max, int** min)
{
int i;
int maxnum = 0;
int minnum = str[0] 1;
for(i=0; i<5; i )
{
if(maxnum < str[i])
{
maxnum = str[i];
*max = &str[i];
}
if(minnum > str[i])
{
minnum = str[i];
*min = &str[i];
}
}
return 0;
}
int main(void)
{
int i = 0;
int len = 0;
int* maxPtr = NULL;
int* minPtr = NULL;
int arr[5]={};
for(i=0; i<5; i )
{
printf("Enter number %d: ",i 1);
scanf("%d", &arr[i]);
}
MaxAndMin(arr, &maxPtr, &minPtr);
printf("%d",*maxPtr);
printf("%d",*minPtr);
printf("Hi");
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/496572.html
上一篇:如何在C中正確釋放動態分配的陣列
