2015-02-08 69 views
1

我試過尋找答案/查看C庫的指針,但不能確定正確的解決方案。我的問題涉及到更改函數的參數。我一直在閱讀指針/函數,根據我的理解,如果函數接受(int x1),那麼當函數完成x1時,函數外部的x1保持不變。但是,如果你傳入一個int * x1,那麼它就會改變。函數參數在C中的變化

我一直在嘗試用它,我已經使用這個帶有幾分方法試過......

void sorting(int *arr, int size) { 
    int *i, *j, temp; 
    int *len = arr + size - 1; 

    for(i = arr; i < len; i++) { 
     for(j = i + 1; j <= len; j++) { 
      if(*j < *i) { 
       temp = *i; 
       *i = *j; 
       *j = temp; 
      } 
     } 
    } 
    int k; 
    for(k = 0; k < size; k++) { 
     printf("k: %d, arr[k]: %d \n", k, *(arr + k)); 
    } 
} 

什麼,這將打印是一個完全排序的列表。然而,在我的主要功能,如果我打電話給這個...

int main() { 

    int temp[5] = {0, 2, 1, 3, 1}; 
    int *p = &temp[5]; 

    sorting(pa, 5); 
    print the values of pa... 

} 

然後,列表仍然未排序,如果打印出pa的值。

如果此問題已解決,是否有人可以將該問題鏈接,我將刪除該帖子。

回答

2

你訪問數組越界這裏:

int *p = &temp[5]; 

有效的指標是[0, 5)。大概需要一個指針的第一個元素:

int *p = &temp[0]; 

但請注意,你可以傳遞一個數組期望一個指針的函數。在這種情況下,陣列衰減的指針的第一個元素:

sorting(temp, 5); 
+0

感謝關於外邊界索引的尖端。你認爲你可以澄清爲什麼我的* arr在函數中被排序,但在主函數中,在進行排序函數調用之後,它沒有排序。 – Steve 2015-02-08 23:44:28

+0

@Someoldlady你的意思是你在解決了無界限訪問後仍然存在這個問題? – juanchopanza 2015-02-08 23:48:04

+0

我意識到除了我的主函數出界外,還有一個小錯誤。它工作得很好,非常感謝! – Steve 2015-02-08 23:51:09