好吧,你有一些问题在这里,让我挖通他们一步一步来。
#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)。 –
即使它的工作,性能将在非常低的一面,每个元素的重新分配.... –
'我