2016-11-23 89 views
-1

以下是用C創建動態數組的示例代碼。我正在尋找簡單的動態數組,但找不到簡單的動態數組。實施我自己的版本。歡迎任何建議。在C中使用指針創建動態數組使用指針答案

#include <stdio.h> 
#include <stdlib.h> 

const int MAX_LENGTH_INC=5; 

int main(void) 
{ 

    int *ptr,i; 
    int maximum_array_size = 1; 
    int index=0; 
    ptr = malloc(MAX_LENGTH_INC * sizeof(int)); 

    printf("Address of previously allocated memory: "); 
    for(i = 0; i < 8; i++) // incrementing upto maximum of size 8 
    { 
     //printf("\n Pointer is:%u\t",ptr + i); 
     //printf("\nindex is: %d",index); 
     ptr[index] = i*2; 
     //printf("\nValue :%d\t",ptr[index]); 

     index++; 
     if(index == maximum_array_size) 
     { 
      //printf("\n Array reached its limit"); 
      ptr= realloc(ptr,sizeof(int)*MAX_LENGTH_INC); 
      maximum_array_size = maximum_array_size + MAX_LENGTH_INC; 
     } 
    } 
    for(i=0;i<index;i++) 
     printf("\n Array Value is %d ",ptr[i]); 
    free(ptr); 

    return 0; 

}

+0

[請參閱此討論關於爲什麼不在'C'中投射'malloc()'和家族的返回值。](http://stackoverflow.com/q/605845/2173917)。 –

+0

即使它的工作,性能將在非常低的一面,每個元素的重新分配.... –

+0

'我

回答

-1

好吧,你有一些問題在這裏,讓我挖通他們一步一步來。

#include <stdio.h> 
#include <stdlib.h> 

const int MAX_LENGTH_INC=1; 

雖然在C中有一個const關鍵字,但我不建議用它來定義這樣的常量。相反,只需使用的#define像這樣:

#define MAX_LENGTH_INC 1 

然而,const int MAX_LENGTH_INC = 1;是沒有錯的,所以你可以把它如果你喜歡它。

int main(void) 
{ 

正確。替代品:int main(int argc, char * argv[]) {。這樣,程序的調用者就可以傳遞命令行參數。在他的節目中,顯然你不需要它,所以void是好的。

int *ptr,i; 
    int maximum_array_size = 1; 

所以,請記住:這是你當前大小的數組。實際上,你想在開始時MAX_LENGTH_INC,我想,這樣更能寫:

int maximum_array_size = MAX_LENGTH_INC; 

這樣一來,如果你增加MAX_LENGTH_INC,也不僅增加後續者的第一次分配的大小。

int index=0; 
    ptr = (int*) malloc(MAX_LENGTH_INC * sizeof(int)); 

評論已經注意到:不要強制轉換malloc的返回值。此外,您也應該在這裏使用可變maximum_array_size這樣:

ptr = malloc(maximum_array_size * sizeof(int)); 

使用sizeof(int)是很常見的款式用C ,只是這裏需要注意的是:sizeof不是功能,而是運營商。因此sizeof int也是有效的。 /編輯:見註釋

printf("Address of previously allocated memory: "); 
    for(i = 0; i < 8; ++i) 
    { 
     //printf("\n Pointer is:%u\t",ptr + i); 
     //printf("\nindex is: %d",index); 
     ptr[index] = i*2; 
     //printf("\nValue :%d\t",ptr[index]); 

     index++; 
     if(index == maximum_array_size) 
     { 
      //printf("\n Array reached its limit"); 

這裏來你的邏輯問題:

   ptr=(int *)realloc(ptr,sizeof(int)*MAX_LENGTH_INC); 
      maximum_array_size = maximum_array_size + MAX_LENGTH_INC; 

你總是realloc數組持有MAX_LENGTH_INC元素。那麼你應該記住,它應該已經增長了,但是你並沒有真正發展它。所以,首先交換兩條線,然後在malloc調用中像上面那樣,使用realloc調用中的變量。

   maximum_array_size = maximum_array_size + MAX_LENGTH_INC; 
      ptr = realloc(ptr, maximum_array_size * sizeof(int)); 

添加maximum_array_size = maximum_array_size + MAX_LENGTH_INC;可以寫爲maximum_array_size += MAX_LENGTH_INC;。這實際上有助於閱讀代碼,因爲現在立即清楚,值MAX_LENGTH_INC將被添加到maximum_array_size

然後你應該決定是否要寫sizeof(int) * numnum * sizeof(int)。我相信,num * sizeof(int)是更合乎邏輯的,因爲你有20個整數,而不是整數20;)

現在,從一個評論的另一個建議是:每增加1迭代將很慢的長循環。因此,更好地加倍緩衝區大小每次迭代:

   maximum_array_size *= 2; 
      ++maximum_array_size; // not exactly needed, I like it this way 

現在,你可能會浪費一點緩衝的,而是會在最垃圾的50%。當然,您應該添加一個新變量:num_array_elements,因爲maximum_array_size不再計算元素的數量。

 } 
    } 
    for(i=0;i<sizeof(ptr);i++) 
     printf("\n Array Value is %d ",ptr[i]); 

再次有評論已經告訴它:sizeof(ptr)在這裏確實是錯誤的。原因是:ptr是一個指針。而且指針的大小始終是相同的(即8個字節),而不管它指向的內存塊的大小如何。你會想在這裏使用新變量num_array_elements

然後,即使對於這裏的一個班輪語句,您應該添加大括號。時間到了,你會添加另一行,然後忘記添加大括號,這樣很容易發現錯誤。所以:

for (i = 0; i < num_array_elements; i++) { 
     printf("\n Array Value is %d ", ptr[i]); 
    } 

另外,正如你所看到的,我添加了一些空格。空格可以更輕鬆地閱讀您的代碼。像forif這樣的控制流關鍵字通常會寫入以下空格,不帶函數調用。語言不在乎,但它被廣泛採用的風格。

free(ptr); 

    return 0; 
} 

休息似乎很好。所以,還沒有爲你做:實際上添加和實現變量num_array_elements並且可能將maximum_array_size重命名爲array_sizemaximum_array_elements。另外,編寫max而不是maximum也被廣泛採用的風格,如寫作num而不是number

+1

'sizeof 2'工作正常,但'sizeof int'無法編譯。您只能省略表達式的括號,而不能使用類型。 –

+0

謝謝,提示,不知道。 –

+0

無論如何,現在我知道,爲什麼人們總是堅持寫括號。 –