【问题标题】:Declaring an 2 dimensional array with size according to input根据输入声明具有大小的二维数组
【发布时间】:2015-02-16 14:19:24
【问题描述】:

说,我想要一个最大长度为 20 的单词数组。我从用户输入中获取要存储的单词数。声明上述数组的最节省内存的方法是什么?

我可以做这样的事情,但我猜它的内存效率不是很高?

char wordArray[1000][20];

也就是说,我希望“1000”根据用户的输入而变化。而我做不到。

int main()
{
    int size;
    printf("Enter size: ");
    scanf("%d", &size);
    char wordArray[size][20];
}

【问题讨论】:

  • 恐怕我们需要更多信息。什么样的输入? 在运行时预先知道输入的大小(我知道它不是在编译时)?
  • 我猜你需要malloc
  • 有趣的是,您可以在符合 C99 的编译器中执行此操作。但是,这并不是一个很好的做法......

标签: c


【解决方案1】:

通常堆栈大小很小,您不能在堆栈上分配如此大量的内存。这样做会导致堆栈溢出。您需要动态分配。

int size;
printf("Enter size: ");
scanf("%d", &size);
char **wordArray = malloc(size*sizeof(char *));

for(int i = 0; i < size; i++)
     wordArray[i] = malloc(20);  

调用free 解除分配。

但是,请注意,这将分配碎片整理的内存,而不是像二维数组那样连续分配。要获得连续的内存分配,您可以使用指向数组的指针

int (*wordArray)[20] = malloc(size * sizeof(*wordArray));  

并以wordArray[i][j] 访问该元素。

更详细的解释请阅读c-faq 16.6: How can I dynamically allocate a multidimensional array?

【讨论】:

  • 打败我 :) 使用 malloc。完成后不要忘记 free() 你的 wordArray。
  • 愚蠢的问题,但是:为什么有必要在这里声明一个指向 char 的指针而不是仅仅指向 char 的指针?
  • @Unheilig;实现二维数组的效果。
  • 我不建议使用在整个堆中碎片化的基于指针的查找表。相反,allocate a 2D array。 OP 请求的是 2D 数组,而不是碎片查找表。
  • 您可以通过char stack_array[1000][20]; memcpy(stack_array, wordArray, sizeof(stack_array)); // crash &amp; burn because wordArray is not an array. 轻松判断查找表没有“达到”二维数组的效果
【解决方案2】:

不,不是,因为您要分配 100000 次 sizeof(char) 的内存。不,你不能像你在这里写的那样做,因为在编译时数组的大小是未知的,所以无法分配空间。你可以使用malloc来做到这一点。

【讨论】:

  • 他可以按照他在 C99 中写的那样做,BUT(这是一个很大的“但是”),它很容易发生堆栈溢出等等 --- 所以,虽然并非不可能,但还是个坏主意。
猜你喜欢
  • 2017-07-14
  • 1970-01-01
  • 2020-03-06
  • 2021-04-17
  • 1970-01-01
  • 1970-01-01
  • 2011-01-14
  • 1970-01-01
  • 2012-03-12
相关资源
最近更新 更多