【问题标题】:C: State of memory during an array declarationC:数组声明期间的内存状态
【发布时间】:2012-02-23 02:32:46
【问题描述】:

我最近为一个任务提交了一个小程序,其中包含以下两个函数和一个 main 方法:

 /** 
  *  Counts the number of bits it
  *  takes to represent an integer a
  */
   int num_bits(int a)
   {
      int bitCount = 0;

      while(a > 0)
      {
         bitCount++;
         a = a >> 1; //shift to the right 1 bit
      }

      return bitCount;
    }

  /**
   * Converts an integer into binary representation
   * stored in an array
   */
   void int2bin_array(int a, int *b)
   {
      //stopping point in search for bits
      int upper_bound = num_bits(a);

      int i;
      for(i = 0; i < upper_bound; i++)
      {
         *(b+i) = (a >> i) & 1; //store the ith bit in b[i]
      }
   }

int main()
{
   int numBits = num_bits(exponent);
   int arr[numBits];     //<- QUESTION IS ABOUT THIS LINE 
   int2bin_array(exponent, arr);

   //do some operations on array arr
}

当我的导师返回程序时,他写了一条关于我在上面标记的行的评论,说由于 numBits 的值直到运行时才知道,所以将数组初始化为 numBits 的大小是一个危险的操作,因为编译器不知道要为数组arr分配多少内存。

我想知道是否有人可以:

1) 验证这是一个危险的操作

2) 解释当我像这样初始化一个数组时内存发生了什么,编译器如何知道要分配什么内存?有没有办法确定分配了多少内存?

任何意见将不胜感激。

【问题讨论】:

标签: c memory-management


【解决方案1】:

这是一个 C99 可变长度数组。它是在运行时(不是由编译器)在栈上分配的,基本上相当于

 char *arr = alloca(num_bits);

在这种情况下,由于你可以知道函数的上限,而且它比较小,你最好用

 char arr[sizeof(int)*CHAR_BIT]; 

此数组的大小在编译时已知,始终适合您需要的所有内容,并且可以在不支持 C99 的平台上工作。

【讨论】:

  • 感谢您的回复。当我使用 gcc 编译时,我没有设置 -std=c99 但这段代码运行良好,在这种情况下我只是幸运,因为上界是如此之低?
  • gcc 默认包含一堆非标准的 C 扩展。 gcc -std=c89 -pedantic 不会编译你的代码。
  • 谢谢,这正是我想要的。
【解决方案2】:

应该没问题,它只会在堆栈上。
唯一的危险是炸毁堆栈。

malloc 将是正常的方式,然后你知道你是否有足够的内存,并且可以就下一步做什么做出明智的决定。但在许多情况下,可以假设您不能将太大的对象放在堆栈上。

但严格来说,如果你没有足够的空间,这将严重失败。

【讨论】:

    猜你喜欢
    • 2010-09-24
    • 1970-01-01
    • 1970-01-01
    • 2016-02-01
    • 2015-07-29
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多