2016-11-23 83 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

无论如何,现在我知道,为什么人们总是坚持写括号。 –