如何制作动态大小的数组?动态数组的一般用法(也许是指针)?

时间:2012-11-17 14:37:33

标签: c++ c arrays pointers dynamic

我正在尝试制作一个

的程序
  1. 接受用户输入(假设所有内容都是int
  2. 将其存储在没有起始大小的数组中(即不是 - > array[5];);然后
  3. 使用存储在数组中的信息用于任何险恶目的。
  4. 我正在寻求帮助,以便我可以在必要时学习如何自行完成。

    • 如何在没有设置大小的情况下制作动态数组?
    • 如何使用/访问/覆盖上述数组中的元素?

    读书对我来说没有足够的解释。

    我知道这是一个非常虚伪的问题,是的,我是一个菜鸟,但要改变我需要一些帮助。

5 个答案:

答案 0 :(得分:16)

C ++

如果您只需要一个容器,请使用std:vector。它会照顾您所需的所有内存分配。但是,如果你想开发自己的动态容器(无论你有什么理由),你必须自己处理内存分配。也就是说,当您的阵列增长时,您必须分配新的内存块,将当前的数组值复制到新的内存位置,并将新值添加到新分配的内存中。通常一个人将这种逻辑包装在一个单独的类中,例如GrowingArray(与标准提供的vector类一样)

修改

详细说明我的答案(假设您将其用于学习目的):

  

将其存储在没有起始大小的数组中(即不是 - > array [5];)

在这里你要使用这样的东西:int * myDynamicArray; 当用户输入一些值时,您将分配存储块,其中将存储这些值:myDynamicArray = new int[5];,其大小与初始输入相同。我还建议在一些变量中保存数组的大小:int arraySize = 5; 如果稍后要将新值附加到myDynamicArray,首先必须为增长的数组(当前数组元素+新数组元素)分配新的内存块。假设你有10个新值。然后你会这样做:int* grownArray = new int[arraySize+10];这为增长的数组分配新的内存块。然后你想要将旧内存块中的项目复制到新的内存块并添加用户附加值(我认为你是为了学习目的而使用它,因此我为你提供了复制elemts的简单循环。你可以使用std:copy或者像c memcopy一样):

int i = 0;
for (; i < arraySize; ++i)
   {
   grownArray[i] = myDynamicArray [i];
   }
// enlarge newly allocated array:
arraySize+= 10;
for (; i < arraySize; ++i)
   {
   grownArray[i] = newValues from somewhere
   }
// release old memory
delete[] myDynamicArray;
// reassign myDynamicArray pointer to point to expanded array
myDynamicArray = gronwArray;

答案 1 :(得分:12)

这可能是最聪明的(对某些人而言,使用神秘的过度STL)...

std::vector<int> vec;

// read integers 1 at a time from the user,
// will stop when non-integer input is entered
std::copy(std::istream_iterator<int>(std::cin),
          std::istream_iterator<int>(), 
          std::back_inserter(vec));

// print out the vector
std::copy(vec.begin(), vec.end(), std::ostream_iterator<int>(std::cout, " "));

答案 2 :(得分:7)

这是我用C ++编写的一些基础知识的代码。

#include <iostream>

int main(int argc, char *argv[])
{
    int* my_dynamic_array;

    int size;
    std::cin >> size;

    my_dynamic_array = new int[size];

    for (int k=0; k<size; k++)
        my_dynamic_array[k] = k;

    for (int k=0; k<size; k++)
        std::cout << my_dynamic_array[k] << std::endl;

    delete[] my_dynamic_array;

    return 0;
}

好的,这就是这段代码中发生的事情。我们使用std :: cin提示数组的大小,然后使用new关键字为数组动态分配一些内存。这里有一些细节,一开始看起来有点奇怪;这似乎会引起许多新C ++开发人员的困惑。

首先,我们使用指针而不是数组声明来声明我们的动态数组,例如我们使用int *my_dynamic_array代替int my_dynamic_array[]。起初这看起来很简单,但是你需要了解C和C ++中发生的事情。

当您静态声明一个数组时,您告诉程序您要将该内存留出来供您使用。它实际上在那里;这是你的开始使用。动态创建数组时,首先使用指针。指针只是对某些记忆的引用。那个记忆还没有分配。如果您尝试使用my_dynamic_array[3]访问其中的某些内容,则会出现令人讨厌的错误。那是因为那个位置的内存实际上没有任何内容(至少没有给程序提供任何内容)。

另请注意使用delete[]代替delete。这就是你完成数组后释放内存的方式。

如果你在C中这样做,你可以用同样的方式考虑这一点,但是newdelete[]代替mallocfree

了解动态数组和指针之间的细微差别非常棘手。我花了一段时间才完全理解发生了什么。祝你好运并坚持下去。

答案 3 :(得分:1)

我有一个建议给你。如果您要使用 C

进行开发,则可以使用链接列表而不是数组

这里是一个例子:

typedef struct linked_list {
    int x,
    struct linked_list *next
} linked_list;

struct linked_list *head = NULL;

void add_element(int x)
{
    struct linked_list *elem;
    elem = malloc(sizeof(struct linked_list));
    elem->x =x;
    elem->next = head;
    head = elem;
}

int main()
{
   int x;
   struct linked_list *p;
   do
   {
       printf("Enter Number : ");
       scanf("%d",&x);
       add_element(x)
       printf("Press 'q' or 'Q' to quit or any other key to continue : ");
       scanf("%c",&c);
   }while(c!='q' && c!='Q');

   for (p=head;p!=NULL;p=p->next)
   {
        printf(%d\r\n",p->x);
   }

}

答案 4 :(得分:0)

在C中你可以使用这种方法。

int i=0;
int *p;
char c;
int size; 
printf("Enter size :");
scanf("%d",&size); 
int *p=malloc(sizeof(int)*size);
do
{
 printf("Enter Number : ");
 scanf("%d",&p[i]);
 i++;
 printf("Press 'q' or 'Q' to quit or any other key to continue : ");
 scanf("%c",&c);
}
while(c!='q' && c!='Q' && i<=size);
p=realloc(p,i*sizeof(int));

这样,如果所需的整数数小于分配的内存,就可以释放分配的其余内存。