2014-11-20 23 views
2

我目前試圖創建一個滿足這些以下要求的源代碼:我應該如何處理此C語句在給定要求的情況下的執行情況?

要求:

//從指數陣列的一部分的深層副本第一到最後一個索引

//包括的。如果成功,則返回一個指向新分配的intarr_t的指針,其中包含指定部分的副本。

//如果發生錯誤,即數組爲空,則第一個或最後一個超出界限,首先返回<,或者內存分配失敗,則返回空指針。

我已經完成了前兩個要求,但似乎我的第三個邏輯是錯誤的,無論我測試多少,我似乎無法找到發生的角落案例。

我的代碼:

intarr_t* intarr_copy_subarray(intarr_t* array, 
       unsigned int first, 
       unsigned int last) 
{ 
    intarr_t *tmp; 
    tmp = malloc((last-first)*sizeof(intarr_t)); 
    // it seems that my if statement is not meeting the requirement in bold. 
    if(first>=0 && last<= array->len && array != NULL && first > last && tmp != NULL) 
    { 
     //perform copying here 
     return tmp; // pointer to new array containing the copied stuff 
    } 
    else 
    { 
     return NULL; 
    } 
} 

typedef struct { 
    int* data; 
    unsigned int len; 
} intarr_t; 

似乎有它時,它不應該返回NULL的情況下,它與我的if語句做。請注意,我正在傳遞我的函數一個typedef結構,其中包含指向數組的指針和長度,但這不是問題。我應該使用OR語句而不是AND語句嗎?

+0

顯示intarr_t的定義。 – 2014-11-20 18:45:23

+0

好的,請等一秒鐘。 – user152573 2014-11-20 18:45:50

+0

如果last 2014-11-20 18:46:57

回答

0

功能可以像

intarr_t* intarr_copy_subarray(const intarr_t *array, 
           unsigned int first, 
           unsigned int last) 
{ 
    if (array == NULL || array->data == NULL || last < first || array->len <= last) 
    { 
     return NULL; 
    }  

    intarr_t *tmp = malloc(sizeof(intarr_t)); 

    if (tmp) 
    { 
     tmp->data = malloc((last - first + 1) * sizeof(int)); 
     if (tmp->data == NULL) 
     { 
      free(tmp); 
      tmp = NULL; 
     } 
     else 
     { 
      tmp->len = last - first + 1; 
      for (unsigned int i = 0; i < tmp->len; i++) 
      { 
       tmp->data[i] = array->data[first + i]; 
      } 
     } 
    } 

    return tmp; 
} 
+0

謝謝你的迴應,我希望我可以檢查標記兩個答案,但我不能。看來我的猜測是正確的,以改變我&&到||。因爲我們希望它在條件爲1且其餘爲0時評估爲邏輯1. – user152573 2014-11-20 19:03:37

+0

@ user152573如果tmp-> data未分配,請參閱我如何釋放tmp。實際上它是一個可以立即使用的解決方案。 – 2014-11-20 19:06:29

+0

我在你的if語句中引用了一些經典的eproblem,我認爲我們應該檢查第一個是否大於或等於0,因爲如果第一個是負數,那麼它就不起作用。 – user152573 2014-11-20 19:09:55

1

所有檢查空第一首先:

if(!array ) 
    return NULL ; 

然後不分配,只是還沒有,但檢查如果你的論點是界限:

if(first>=0 && last< array->len && first <= last) 
{ 

然後分配內存,如果成功複製數組到新的子數組。

由於intarr_t(_t是一個保留的標識符),你的示例分配是不正確的,它保存了一個指向int數組的指針。您應該分配一個intarr_t然後陣列它指向:

intarr_t tmp = malloc(sizeof(intarr_t)) ; 
if(tmp) 
{ 
    tmp->data = malloc(sizeof(int) * (last - first + 1)) ; 
    //check if malloc succeeded again 
    tmp->len = last - first + 1 ; 
    ... 
+0

我看到,在檢查傳遞的數組後,我們可以檢查傳遞的指數是否良好,然後我們分配一個新的指針,並檢查它是否爲NULL,如果不是我們複製。 – user152573 2014-11-20 18:54:56

+0

對於你的if語句,我意識到首先應該小於或等於最後一個以防我們決定只複製一個我認爲是的元素? – user152573 2014-11-20 18:59:13

+0

@ user152573嗯,是的,如果你只複製一個元素,那麼首先==最後。 – 2501 2014-11-20 18:59:44

相關問題