【问题标题】:vector replication in cc中的向量复制
【发布时间】:2012-05-05 09:44:45
【问题描述】:

如何在 c 中定义一个像向量一样工作的数组?该数组应采用任意数量的值。它可以取 0 个值或 10 个值或 100 个值。

下面的代码有效,但给我一个运行时错误,即堆栈已损坏。

int i = 0;
    int* aPtr = &i;
    int* head = aPtr;
    for(i=0;i<6;i++){
        (*aPtr)=i;
        aPtr++;
    }

同样,我如何使用char* str 来获取任意数量的字符,最后是空字符来生成字符串?

面试练习:)

【问题讨论】:

  • 如果你的代码给你运行时错误,它就不起作用。您要做的就是写超过分配的i 内存,这将导致分段错误。 C++ 向量基本上是动态数组,周围有很多细节。如果你想在 C 中复制一个向量,那么它比你正在做的事情要多得多,但我不知道你想要做多少。
  • 是的,这就是为什么我想知道正确的方法
  • 好吧,一方面,C++ std::vector 你想做什么?一切?基本是实现一个结构,它可能有一个指针和一个定义大小的int,然后编写一堆函数来接受这些结构并对它们进行操作,指针就是你的动态数组。如果你只想要一个动态数组,学习使用C memory allocation
  • 是 C 还是 C++?你已经标记了两者,但你的正文只提到了 C。
  • 您可能会从我的older answers 中获得一些一般性指导。最大的变化是它删除了缓冲区中最旧的对象,您需要分配更多的缓冲区空间,将现有数据复制到新空间,添加新项目并删除旧空间。

标签: c


【解决方案1】:

根据您的要求,在 C 中有很多方法可以做到这一点,但您说的是“任意数量的值”(这通常意味着尽可能多的值)。这通常使用realloc 来动态增加数组的大小。随着数组的增长,您还需要保留一些有关数组大小的簿记信息。

void
store (vector_t * v, int idx, int value)
{
  if (v->size < idx) {
     v->size = idx * 2;
     v->data = realloc(v->data, v->size);
  }
  v->data[idx] = value;
}

这个被标记为“作业”,我留下了一些细节要填写,比如vector_t的定义。

【讨论】:

    【解决方案2】:

    在您的 for 循环中,在第一次迭代之后,您尝试访问指向之前未声明或保留的内存位置的 aPtr。在第一次迭代中,int i 为您分配了内存。

    您可以做的是使用 malloc 初始分配所需的内存。 一旦分配了这块内存,并且只遍历分配的堆栈空间,就不会遇到运行时错误。

    PS:如果只是编译,您的代码将不起作用。任何程序都可能包含运行时和编译时错误。您的代码示例是一个非常常见的运行时错误示例。

    【讨论】:

      【解决方案3】:

      这并不难。要记住的重要一点是,您最初需要使用 malloc(...) 或 calloc(...) 为数组分配内存。之后,您可以在添加或删除项目时轻松分配(或取消分配)内存。动态添加或删除内存(用于存储数组中的项目)的方法是 realloc(...)。 C Dynamic Memory Allocation 的 wiki 页面实际上信息量很大。我在下面提供了一个示例,展示了如何最初分配一个 char* 数组,然后增加大小并减小大小。

      #include "stdio.h"
      #include "stdlib.h"
      
      int main()
      {
        char *myDynamicString;
      
        /* allocate initial memory */
        myDynamicString = (char *)malloc(sizeof(char) * 2);
        myDynamicString[1] = '\0';
      
        /* set values */
        myDynamicString[0] = 'A';
      
        /* prints: A */
        printf("String: %s\n", myDynamicString);
      
        /* make string bigger */
        myDynamicString = (char *)realloc(myDynamicString, sizeof(char) * 6);
        myDynamicString[5] = '\0';
      
        /* set values */
        myDynamicString[1] = 'P';
        myDynamicString[2] = 'P';
        myDynamicString[3] = 'L';
        myDynamicString[4] = 'E';
      
        /* prints: APPLE */
        printf("Bigger String: %s\n", myDynamicString);
      
        /* make string smaller */
        myDynamicString = (char *)realloc(myDynamicString, sizeof(char) * 3);
        myDynamicString[2] = '\0';
      
        /* set values */
        myDynamicString[1] = 'Z';
      
        /* prints: AZ */
        printf("Smaller String: %s\n", myDynamicString);
      
        /* don't forget to release the memory */
        free(myDynamicString);
      
        return 0;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-29
        • 2012-11-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-14
        • 2015-10-20
        相关资源
        最近更新 更多