У меня есть следующий кусок кода в Xcode. Я разрабатываю этот код для встроенного приложения, поэтому стараюсь избегать использования malloc.
void checkForFaults(char seqToCheck[], int bytesInSequence, int bitsSet)
{
int i;
int count = 0;
unsigned int faultPositions[bitsSet];
int position = 0;
int pos = 0;
int j;
int a;
for(i=bytesInSequence-1;i>=0;i--)
{
unsigned char faultsAt[countBitsSet(seqToCheck[i])];
detectFaults(seqToCheck[i], faultsAt, 0);
count = countBitsSet(seqToCheck[i]);
j=0;
while(j<count)
{
a = position*8 + faultsAt[j];
faultPositions[pos] = a;
printf("%d ",faultPositions[pos]);
pos++;
j++;
}
position++;
}
printf("Faults At: ");
for(i=0;i<bitsSet;i++)
{
printf("%d\n",faultPositions[i]);
}
}
Вот что делает этот код: он находит позиции единиц в битовом массиве (seqToCheck[]
. Он делает это, вызывая detectFaults
побайтово-байтово. detectFaults
возвращает небольшой массив который содержит позиции единиц в байте, который был ему передан - он возвращает эти значения в массиве * 1007. * Затем эта функция смещает эти позиции и устанавливает истинную позицию единиц в массиве faultPositions
. у данных, которые я ввожу, есть «1» в позициях 8, 24 и 28.
Вы заметите, что я определяю размер faultPositions
во время выполнения. Если я выберу LLVM, первый оператор printf напечатает: 8, 24 и 28 - что правильно. Второе утверждение printf печатает «32, 24 и 28», что меня озадачило. Если я изменю компилятор на GCC4.2, оба оператора printf выдают 8,24 и 28.
В целом, это не касается меня. Код предназначен для AVR-GCC, поэтому там должно быть все в порядке (надеюсь), но я все еще был в замешательстве и хотел знать, почему это происходит.