我正在為 C 中的類解決一個問題,我從未排序的陣列中回傳最大值,并將該值的索引存盤在指標中index_ptr。
這是我構建的代碼:
int get_biggest_index(int array[], size_t array_size, int *index_ptr){
int max = array[0], index;
for (int i = 0; i < array_size-1; i ){
if (array[i 1] > max){
max = array[i];
index = i;
}
}
index_ptr = &index;
printf("idx: %d\n", *index_ptr); //purely for testing
return max;
}
我知道上面的作業是為了回傳最高值,但在這種情況下運行它:
int main() {
int arr[5] = {4, 7, 3, 9, 5};
size_t arr_size = 5;
int *idx;
printf("biggest value in array arr => %d\n", get_biggest_index(arr, arr_size, idx));
printf("idx of biggest value => %d", *idx);
return 0;
}
輸出是:
idx: 3
max value in array arr => 9
idx of max value => -98693133
有人可以具體解釋一下為什么會發生這種情況關于指標的值以及如何修復它?
我也很樂意聽取有關其余代碼的任何其他建議,因為我相信它會更好。
非常感謝你的幫助!
uj5u.com熱心網友回復:
變數在函式內部index是區域的get_biggest_index。它的生命周期將在函式回傳時結束,任何指向它的指標都將失效。
盡管這不是問題,因為index_ptr它也是一個區域變數,當函式回傳時,它的生命周期結束時其值將丟失。
問題是你誤解了在 C 中模擬傳遞參考的作業原理。你不應該傳遞一個指標,并讓它指向函式中的一個變數。相反,您應該&在呼叫中使用指標運算子來傳遞指向現有變數的指標。然后在函式中解參考指標以設定原始變數值。
像這樣的東西:
int get_biggest_index(int array[], size_t array_size, int *index_ptr){
int index;
// ...
*index_ptr = index; // Set the *value*
// ...
}
并將其稱為:
int idx; // Not a pointer
get_biggest_index(arr, arr_size, &idx); // Pass pointer to the idx variable
uj5u.com熱心網友回復:
您應該分配給index_ptr的值index而不是 的地址index。您應該在第8行替換index_ptr = &index;為。把一個指標想象成一個桶。如果放在它之前,您將訪問存盤桶的內容。*index_ptr = index*
在您的特定情況下,您將存盤桶發送到一個函式,并希望用最大數字的索引填充它。當您這樣做時,index_ptr = &index;您將用另一個桶替換原來的桶,并將原來的桶留空。
正確的代碼應該是:
int get_biggest_index(int array[], size_t array_size, int *index_ptr){
int max = array[0], index;
for (int i = 0; i < array_size-1; i ){
if (array[i 1] > max){
max = array[i];
index = i;
}
}
*index_ptr = index; // this is correct
printf("idx: %d\n", *index_ptr); //purely for testing
return max;
}
uj5u.com熱心網友回復:
int *index_ptr是函式的區域變數。它不會回傳給呼叫者,因此index_ptr = &index;沒有任何意義。此外,您不能將回傳的指標指向區域變數的地址,因為區域變數在函式完成時超出范圍。
一個更明智的函式是這樣的:
int* get_biggest_index (size_t size, int array[size]){
int* result = NULL;
int max = INT_MIN;
for (int i = 0; i<size; i ){
if (array[i] > max){
max = array[i];
result = &array[i];
}
}
return result;
}
如果大小為零,這不會越界訪問陣列。出錯時回傳NULL,否則回傳指向最大項的指標。它指向傳遞的陣列,因此它不參考區域變數。回傳的指標按值復制給呼叫者。
uj5u.com熱心網友回復:
對于索引使用size_t型別(不是int)。始終如一。
int get_biggest_index(int *array, size_t array_size, size_t *index_ptr){
int max = array[0];
*index_ptr = 0;
for (size_t i = 1; i < array_size; i ){
if (array[i] > array[*index_ptr]){
*index_ptr = i;
}
}
printf("idx: %zu\n", *index_ptr); //purely for testing
return array[*index_ptr];
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/322570.html
