【问题标题】:Declaring a long long array with unsigned int size用 unsigned int 大小声明一个 long long 数组
【发布时间】:2014-12-19 12:15:58
【问题描述】:

我在声明数组时遇到分段错误时遇到了问题:

long long ways[max+1];  

在哪里,

unsigned int max = findMax(l,T); // l is an unsigned int array and T is an int.  

并且 findMax 是以下类型的函数:

unsigned int findMax(unsigned int arr[],int size)  

我该如何解决这个问题?

【问题讨论】:

  • max 有多大?可能是堆栈溢出。

标签: c arrays unsigned-integer long-long


【解决方案1】:

一个可能的原因是数组对于堆栈来说太大了。

目前典型的堆栈大小为 1-16 Mb(在嵌入式系统中可能要小得多)。如果long long 是 8 个字节,则意味着分配一个包含超过 125000 个元素的数组可能会出现问题。而且您还想为其他自动变量留出空间。

不应该在堆栈上分配真正大的数组。

您可以尝试在堆中分配它:

long long *ways = calloc(max+1, sizeof *ways);
if (ways == NULL) {
    // allocation failed!!
}
// Do stuff.
free(ways);

【讨论】:

  • 小创意:改用long long *ways = calloc(max+1, sizeof *ways); 样式。 IMO,更容易编码和维护。
  • @chux 同意!这样一来,如果您想更改数组的类型,就少了一个地方可以更改。
  • 对不起,我看不出这两者的区别。
  • @Chandan 我已经更新了我的答案。 sizeof *ways 优于 sizeof (long long)
  • 它将使用相同数量的内存,但来自堆而不是堆栈。
猜你喜欢
  • 2016-07-29
  • 1970-01-01
  • 2013-08-17
  • 2018-10-06
  • 1970-01-01
  • 2012-01-27
  • 1970-01-01
  • 2016-12-20
  • 2019-12-12
相关资源
最近更新 更多