Использование указателей в C ++ - PullRequest
2 голосов
/ 17 декабря 2011

Я пытаюсь написать функцию, которая преобразует int в байт следующим образом:

int * key = convertTo8bits(255);
for(int i = 0; i<8; i++)
cout<<key[i]<<endl;

Возвращает неожиданный вывод. Массив, который он распечатывает, состоит из абсурдно больших чисел, тогда как это прекрасно работает:

int * convertTo8bits(int x)
{
int total = 0;
int key[8];
for(int i = 0; i<8; i++)
    key[i] = 0;
if(total + 128 <= x)
{
    key[7] = 1;
    total += 128;
}
if(total + 64 <= x)
{
    key[6] = 1;
    total += 64;
}
if(total + 32 <= x)
{
    key[5] = 1;
    total += 32;
}
if(total + 16 <= x)
{
    key[4] = 1;
    total += 16;
}
if(total + 8 <= x)
{
    key[3] = 1;
    total += 8;
}
if(total + 4 <= x)
{
    key[2] = 1;
    total += 4;
}
if(total + 2 <= x)
{
    key[1] = 1;
    total += 2;
}
if(total + 1 <= x)
{
    key[0] = 1;
    total += 1;
}

for(int i = 0; i<8; i++)
    cout<<key[i]<<endl;

return key;
}

Можете ли вы указать на мою ошибку? Thx.

Ответы [ 2 ]

8 голосов
/ 17 декабря 2011

Вы возвращаете указатель на локальную переменную (массив int key[8]).Это неопределенное поведение , потому что локальная переменная выходит из области видимости (т. Е. Ее время жизни заканчивается) после завершения функции.

В C ++ вы можете использовать std::vector<int> вместо необработанногомассив, потому что вы можете вернуть его по значению, а не через указатель.


Сначала я думал, что это вопрос C, и в этом случае мой первоначальный ответ был бы уместным: У вас есть несколько возможных решений: Динамически распределить массив с помощью malloc.(Это не очень хорошо, потому что в какой-то момент вам придется запомнить free.) Передать указатель на массив в качестве аргумента функции и записать результаты в этот массив. Объявить typedef struct { int x[8]; } key;;затем вы можете вернуть структуру по значению, а не через указатель.
2 голосов
/ 17 декабря 2011

Оли правильно определил причину вашей проблемы. Я также думаю, что стоит отметить, что ваш код излишне сложен. Вы можете написать это проще с помощью цикла и побитового сдвига:

void extractbits(int x, int key[], int len)
{
    for (int i = 0; i<len; i++)
    {
        key[i] = x & 1;
        x >>= 1;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...