這裏固定功能的第一次迭代。它仍然不是100%,因爲我會寫它,但僅限於解決問題的問題。
當你想要返回的地址,我調整了返回類型以及可變tempAdd
int* lowest(int *j, int n) { //For finding the lowest element
int i, temp;
int *tempAdd;
for(i = 0; i < n; i++) {
if(temp > *(j + i)) {
temp = *(j + i);
tempAdd = j + i;
}
}
return tempAdd; //Sends the address of the lowest element
}
EG的類型,參數n = 0
你的函數的返回值會如果沒有進一步的變化是不確定的到功能製作。
由於變量temp
也未初始化初始化,所以如果數組中沒有成員小於變量temp
的(隨機)值,返回的地址也是未定義的。
這裏,稍微更強大的版本:
int* lowest(int *j, int n) { //For finding the lowest element
if(0 == n) return NULL; // empty arrays have no smallest element!
int i;
int temp = j[0]; // instead of using pointer arithmetic you can also use this syntax.
int *tempAdd = j; // initially the first element is allegedly the smallest...
for(i = 1; i < n; i++) // loop starts at index 1 now!
{
if(temp > *(j + i)) {
temp = *(j + i);
tempAdd = j + i;
}
}
return tempAdd; //Sends the address of the lowest element
}
你的功能main()
也有它的問題。你不能創建一個動態大小的自動(堆棧位置)數組,這是你的嘗試。相反,如果你想查詢用戶數組的大小,你將不得不求助於一個基於堆的數組。或者你會查詢一個大小,它是小於或等於你的基於棧的數組的任意選擇的固定大小。
int main() {
int n = 0;
printf("Enter the number of inputs (1..500): ");
scanf("%d", &n);
if(n < 1 || n > 500) {
puts("Invalid input.");
return -1;
}
int arr[500]; // 500 was chosen because most likely no one is crazy enough to manually type in more values by hand ;)
int i;
for(i = 0; i < n; i++) {
printf("\nEnter element no. %d: ", i + 1);
scanf("%d", &arr[i]);
}
for(i = 0; i < n; i++) {
printf("Element no. %d is %d with the address %d.\n", i + 1, *(arr + i), arr + i);
}
int * low = lowest(arr, n); //Saves the address of the lowest element.
printf("\nThe Lowest element in the list is %d with address %p.", *low, low); //Error occurs
return 0;
}
還將指針的格式更改爲「%p」。 也將low
的類型從int
更改爲int *
。
最後重要的是,如果您允許0數組大小,您將不得不進一步更改main()
。爲什麼?因爲在你的printf中你寫了...,*low,...
。由於最低()在n = 0
的情況下將返回NULL,所以您將取消引用NULL指針,這會導致令人討厭的運行時錯誤。從設計的角度來看,最終,返回最低位()中的地址似乎打破了抽象層次,這與你傳遞數組長度有關。基本上,你混合了兩種風格。
- STL-風格將是:
int * lowest(int *begin, int * end)
- Vintage-風格將是:
int lowestIndex(int *arr, int n)
第二個版本,雖然會有,你不能表達「沒有結果」的結果的問題。例如,數組大小爲0或其他無效參數正在傳遞給函數。因此,人們往往會做這種方式來代替:
bool lowestIndex(int * arr, int n, int *result)
...這裏的返回值表示成功,結果內容僅如果返回有效值是true
。
如果你想返回的最小地址元素,你的「最低」函數應該有返回類型''int *''。但它有''int''。 – BitTickler
1)'tempAdd = j + i;'你正在嘗試給整數分配一個地址。 2)你還沒有給temp賦值,所以我們不能預測第一個if的值是多少? – Karthick
現在還不清楚這是C還是C++的問題。不要用兩個標籤標記你的問題,因爲它們是不同的語言。 – Archimaredes