1

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

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

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

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

面试练习:)

4

3 回答 3

2

根据您的要求,在 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的定义。

于 2012-04-24T18:51:30.717 回答
1

这并不太难。要记住的重要一点是,您最初需要使用 malloc(...) 或 calloc(...) 为数组分配内存。之后,您可以在添加或删除项目时轻松分配(或取消分配)内存。动态添加或删除内存(用于存储数组中的项目)的方法是 realloc(...)。C 动态内存分配的 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;
}
于 2012-04-24T18:47:38.233 回答
1

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

不过,您可以做的是最初使用malloc. 一旦分配了此内存,并且仅遍历分配的堆栈空间,您将不会遇到运行时错误。

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

于 2012-04-24T18:44:57.293 回答