C:数组声明期间的内存状态

标签 c memory-management

我最近提交了一个作业的小程序,其中有以下两个功能和一个主要方法:

 /** 
  *  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) 解释当我像这样初始化一个数组时内存方面发生了什么,编译器如何知道要分配什么内存?有什么方法可以确定分配了多少内存?

如有任何意见,我们将不胜感激。

最佳答案

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

 char *arr = alloca(num_bits);

在这种情况下,因为您可以知道函数的上限,而且它相对较小,所以您最好使用

 char arr[sizeof(int)*CHAR_BIT]; 

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

关于C:数组声明期间的内存状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9406329/

相关文章:

计算堆栈上的帧数

c - 将sqlite3 db数据读入uint64_t

c - 我的调试文本显示垃圾

c++ - 不使用第三方头文件编写纯代码

c++ - curl_easy_cleanup 不释放资源

c++ - 有效传输平面图像以在 OpenGL 中渲染?

c++ - 指令级并行探索

c++ - 在内存中存储大量数据

memory-management - Go怎么没有stackoverflow

memory-management - GPU 访问系统 RAM