Я недавно представил небольшую программу для задания, в которой были следующие две функции и основной метод:
/**
* 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) объяснить, что происходит с памятью, когда я инициализирую такой массив,как компилятор знает, какую память выделить?Есть ли способ определить, сколько памяти было выделено?
Будем благодарны за любые входные данные.