好的,这里有一些问题,让我一步一步地挖掘它们。
#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 个 int 而不是 int 20s ;)
现在评论中的另一个建议是:每次迭代递增 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。