好吧,你有一些問題在這裏,讓我挖通他們一步一步來。
#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) * num
或num * 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]);
}
另外,正如你所看到的,我添加了一些空格。空格可以更輕鬆地閱讀您的代碼。像for
和if
這樣的控制流關鍵字通常會寫入以下空格,不帶函數調用。語言不在乎,但它被廣泛採用的風格。
free(ptr);
return 0;
}
休息似乎很好。所以,還沒有爲你做:實際上添加和實現變量num_array_elements
並且可能將maximum_array_size
重命名爲array_size
或maximum_array_elements
。另外,編寫max
而不是maximum
也被廣泛採用的風格,如寫作num
而不是number
。
[請參閱此討論關於爲什麼不在'C'中投射'malloc()'和家族的返回值。](http://stackoverflow.com/q/605845/2173917)。 –
即使它的工作,性能將在非常低的一面,每個元素的重新分配.... –
'我