我最近提交了一个作业的小程序,其中有以下两个功能和一个主要方法:
/**
* 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/